Repository: benjamindean/flutter_vibration Branch: master Commit: fcc432161afb Files: 131 Total size: 311.2 KB Directory structure: gitextract_02fjpw07/ ├── .gitignore ├── .metadata ├── .travis.yml ├── .vscode/ │ └── settings.json ├── README.md ├── vibration/ │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── android/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── settings.gradle │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── benjaminabel/ │ │ └── vibration/ │ │ ├── Vibration.java │ │ ├── VibrationMethodChannelHandler.java │ │ └── VibrationPlugin.java │ ├── example/ │ │ ├── .gitignore │ │ ├── .metadata │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── android/ │ │ │ ├── .gitignore │ │ │ ├── app/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ ├── debug/ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ ├── main/ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ ├── java/ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ └── example/ │ │ │ │ │ │ └── MainActivity.java │ │ │ │ │ └── res/ │ │ │ │ │ ├── drawable/ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable-v21/ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── values/ │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values-night/ │ │ │ │ │ └── styles.xml │ │ │ │ └── profile/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── build.gradle │ │ │ ├── gradle/ │ │ │ │ └── wrapper/ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradle.properties │ │ │ └── settings.gradle │ │ ├── ios/ │ │ │ ├── .gitignore │ │ │ ├── Flutter/ │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ ├── Debug.xcconfig │ │ │ │ ├── Flutter.podspec │ │ │ │ └── Release.xcconfig │ │ │ ├── Runner/ │ │ │ │ ├── AppDelegate.swift │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── README.md │ │ │ │ ├── Base.lproj/ │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ └── Main.storyboard │ │ │ │ ├── Info.plist │ │ │ │ └── Runner-Bridging-Header.h │ │ │ ├── Runner.xcodeproj/ │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ └── xcshareddata/ │ │ │ │ └── xcschemes/ │ │ │ │ └── Runner.xcscheme │ │ │ ├── Runner.xcworkspace/ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata/ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── RunnerTests/ │ │ │ └── RunnerTests.swift │ │ ├── lib/ │ │ │ └── main.dart │ │ └── pubspec.yaml │ ├── ios/ │ │ ├── .gitignore │ │ ├── vibration/ │ │ │ ├── Package.swift │ │ │ └── Sources/ │ │ │ └── vibration/ │ │ │ ├── Resources/ │ │ │ │ └── PrivacyInfo.xcprivacy │ │ │ └── VibrationPlugin.swift │ │ └── vibration.podspec │ ├── lib/ │ │ ├── vibration.dart │ │ └── vibration_presets.dart │ ├── pubspec.yaml │ └── test/ │ └── vibration_test.dart ├── vibration.iml ├── vibration_ohos/ │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── example/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── assets/ │ │ │ └── haptic_file.json │ │ ├── lib/ │ │ │ └── main.dart │ │ ├── ohos/ │ │ │ ├── .gitignore │ │ │ ├── AppScope/ │ │ │ │ ├── app.json5 │ │ │ │ └── resources/ │ │ │ │ └── base/ │ │ │ │ └── element/ │ │ │ │ └── string.json │ │ │ ├── build-profile.json5 │ │ │ ├── entry/ │ │ │ │ ├── .gitignore │ │ │ │ ├── build-profile.json5 │ │ │ │ ├── hvigorfile.ts │ │ │ │ ├── oh-package.json5 │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── ets/ │ │ │ │ │ ├── entryability/ │ │ │ │ │ │ └── EntryAbility.ets │ │ │ │ │ ├── pages/ │ │ │ │ │ │ └── Index.ets │ │ │ │ │ └── plugins/ │ │ │ │ │ └── GeneratedPluginRegistrant.ets │ │ │ │ ├── module.json5 │ │ │ │ └── resources/ │ │ │ │ ├── base/ │ │ │ │ │ ├── element/ │ │ │ │ │ │ ├── color.json │ │ │ │ │ │ └── string.json │ │ │ │ │ └── profile/ │ │ │ │ │ └── main_pages.json │ │ │ │ ├── en_US/ │ │ │ │ │ └── element/ │ │ │ │ │ └── string.json │ │ │ │ └── zh_CN/ │ │ │ │ └── element/ │ │ │ │ └── string.json │ │ │ ├── hvigor/ │ │ │ │ ├── hvigor-config.json5 │ │ │ │ └── hvigor-wrapper.js │ │ │ ├── hvigorfile.ts │ │ │ ├── hvigorw │ │ │ ├── hvigorw.bat │ │ │ └── oh-package.json5 │ │ └── pubspec.yaml │ ├── lib/ │ │ └── vibration_ohos.dart │ ├── ohos/ │ │ ├── .gitignore │ │ ├── build-profile.json5 │ │ ├── hvigorfile.ts │ │ ├── index.ets │ │ ├── oh-package.json5 │ │ └── src/ │ │ └── main/ │ │ ├── ets/ │ │ │ └── components/ │ │ │ └── plugin/ │ │ │ └── VibrationOhosPlugin.ets │ │ └── module.json5 │ └── pubspec.yaml ├── vibration_platform_interface/ │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── lib/ │ │ ├── src/ │ │ │ └── method_channel_vibration.dart │ │ └── vibration_platform_interface.dart │ └── pubspec.yaml └── vibration_web/ ├── .flutter-plugins ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── ios/ │ ├── .gitignore │ └── vibration_web.podspec ├── lib/ │ └── vibration_web.dart ├── pubspec.yaml └── vibration_web.iml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .DS_Store .dart_tool/ .packages .pub/ pubspec.lock .idea/ build/ doc/ flutter_export_environment.sh .flutter-plugins-dependencies ================================================ FILE: .metadata ================================================ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled and should not be manually edited. version: revision: 5391447fae6209bb21a89e6a5a6583cac1af9b4b channel: stable project_type: plugin ================================================ FILE: .travis.yml ================================================ os: - linux sudo: false addons: apt: sources: - ubuntu-toolchain-r-test packages: - libstdc++6 - fonts-droid-fallback before_script: - git clone https://github.com/flutter/flutter.git -b stable - ./flutter/bin/flutter doctor script: - cd vibration && ../flutter/bin/flutter test cache: directories: - $HOME/.pub-cache ================================================ FILE: .vscode/settings.json ================================================ { "files.exclude": { "**/.classpath": true, "**/.project": true, "**/.settings": true, "**/.factorypath": true }, "java.configuration.updateBuildConfiguration": "interactive" } ================================================ FILE: README.md ================================================ # Vibration [![Build Status](https://travis-ci.org/benjamindean/flutter_vibration.svg?branch=master)](https://travis-ci.org/benjamindean/flutter_vibration) A plugin for handling Vibration API on iOS, Android, and web. [API docs.](https://pub.dartlang.org/documentation/vibration/latest/vibration/Vibration-class.html) ## Versions [Android, iOS.](vibration) [Web.](vibration_web) ================================================ FILE: vibration/.gitignore ================================================ # Miscellaneous *.class *.log *.pyc *.swp .DS_Store .atom/ .build/ .buildlog/ .history .svn/ .swiftpm/ migrate_working_dir/ # IntelliJ related *.iml *.ipr *.iws .idea/ # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. #.vscode/ # Flutter/Dart/Pub related # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. /pubspec.lock **/doc/api/ .dart_tool/ .flutter-plugins .flutter-plugins-dependencies build/ ================================================ FILE: vibration/.metadata ================================================ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled and should not be manually edited. version: revision: "17025dd88227cd9532c33fa78f5250d548d87e9a" channel: "stable" project_type: plugin # Tracks metadata for the flutter migrate command migration: platforms: - platform: root create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a - platform: android create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a - platform: ios create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a # User provided section # List of Local paths (relative to this file) that should be # ignored by the migrate tool. # # Files that are not part of the templates will be ignored by default. unmanaged_files: - 'lib/main.dart' - 'ios/Runner.xcodeproj/project.pbxproj' ================================================ FILE: vibration/CHANGELOG.md ================================================ ### 3.1.8 - Fix `repeat` parameter ignored on iOS. (#145 by @zeienko-vitalii) ### 3.1.7 - Fix Android deprecation warning for VIBRATOR_SERVICE. (#144 by @zeienko-vitalii) ### 3.1.7-dev.1 - Attempt to fix deprecation warning on Android. ### 3.1.6 - Fix crash on Android. (#140 by @armanagarwal) ### 3.1.5 - Adds Swift Package Manager compatibility. ### 3.1.4 > Note: This release has breaking changes. > > Plugin now requires the following: > > - Android Gradle Plugin >=8.12.1 > - Gradle wrapper >=8.13 > - Kotlin 2.2.0 - Bump package `vibration_platform_interface` to "0.1.1" ### 3.1.3 - Fix intensities on iOS. - Lower miminum Compile SDK version for Android to 34 ### 3.1.2 - Restore `hasAmplitudeControl` and `hasCustomVibrationsSupport` methods. ### 3.1.1 - Fix some cases where intensities were not being used correctly. ### 3.1.0 - Add common vibration patterns for Android and iOS. - Add `sharpness` parameter for iOS. - Suppress deprecation warnings for `vibrate` method on Android. ### 3.0.0 - The plugin has been recreated from scratch to align with the latest Flutter and Dart features. - The iOS version no longer depends on intensities and amplitude, and it now supports custom durations and patterns. - The example app is more intuitive and user-friendly. - Calling the `hasVibrator` method is no longer necessary. - Adjustments for null safety have been implemented. ## 2.1.0 - Fix vibration on iOS - All methods are now properly null-safe ## 2.0.1 - Bump package `vibration_platform_interface` to "0.0.2" ## 2.0.0 - Remove references to Android embedding v1 - Update package:web to ">=0.5.1 <2.0.0" (#105 by [dkrutskikh](https://github.com/dkrutskikh)) ## 1.9.0 - Added OpenHarmony support - Migrate to common platform implement (vibration_platform_interface) ## 1.8.4 - Added Web support (#95 by [san-smith](https://github.com/san-smith)) ## 1.8.2 - Raise minimum and target SDK versions for Android to upgrade Gradle to 7.5. ## 1.8.0 - Use `device_info_plus` for `hasAmplitudeControl` and `hasVibrator` methods. ## 1.7.7 - Adds a namespace attribute to the Android build.gradle, for compatibility with Android Gradle Plugin 8.0. ## 1.7.6 - Update package's dart SDK max version (under 3.0.0) ## 1.7.5 - Bump `vibration_web` to 1.6.4. ## 1.7.4 - Migrating to null safety. ## 1.7.3 - Use targetEnvironment check on iOS. ## 1.7.2 - Updated description to indicate web support. ## 1.7.1 - Fix building on iOS. ## 1.7.0 - Use Android Embedding v2. ## 1.6.1 - Added Web support (#43 by [roulljdh](https://github.com/roulljdh)) ## 1.5.0 - Fibration now works in backgroud on Android (#40 by [wanghaiyang5241](https://github.com/wanghaiyang5241)) ## 1.4.0 - Added a `hasCustomVibrationsSupport` method (#34 by [Skyost](https://github.com/Skyost)) - Use Swift 5.0 ## 1.3.1 - Fix #32 (by [Hugo Heneault](https://github.com/HugoHeneault)) ## 1.3.0 - Add support for CoreHaptics on iOS devices #30 (by [Leicas](https://github.com/Leicas)) ## 1.2.4 - Move `flutter_test` to dev_dependencies. Fixes issue #24. ## 1.2.3 - Add proper indication of async methods to docs (by [@qqgg231](https://github.com/qqgg231)) ## 1.2.2 - Suppress deprecation warnings for `vibrate` method ## 1.2.1 - Maintenance release ## 1.2.0 - Add support for amplitude control under Android 8.0 and later (by [@pmundt](https://github.com/pmundt)) ## 1.1.0 - Migrate to AndroidX (by [@gastonmuijtjens](https://github.com/gastonmuijtjens)) - Add unit test for canceling vibration (by [@vintage](https://github.com/vintage)) ## 1.0.2 - Update vibration.podspec ## 1.0.1 - Implemented `cancel` method for iOS ## 1.0.0 - Initial Release ================================================ FILE: vibration/LICENSE ================================================ BSD 2-Clause License Copyright (c) 2018, Benjamin Dean All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vibration/README.md ================================================ # Vibration [![Build Status](https://travis-ci.org/benjamindean/flutter_vibration.svg?branch=master)](https://travis-ci.org/benjamindean/flutter_vibration) A plugin for handling Vibration API on iOS, Android, and web. [API docs.](https://pub.dartlang.org/documentation/vibration/latest/vibration/Vibration-class.html) ## Getting Started 1. Add `vibration` to the dependencies section of `pubspec.yaml`. ```yml dependencies: vibration: ^3.1.3 ``` 2. Import package: ```dart import 'package:vibration/vibration.dart'; ``` ## Methods ### hasVibrator Check if the target device has vibration capabilities. Not required when using other methods. ```dart if (await Vibration.hasVibrator()) { Vibration.vibrate(); } ``` ### hasAmplitudeControl Check if the target device has the ability to control the vibration amplitude, introduced in Android 8.0 Oreo - false for all earlier API levels. ```dart if (await Vibration.hasAmplitudeControl()) { Vibration.vibrate(amplitude: 128); } ``` ### hasCustomVibrationsSupport Check if the device is able to vibrate with a custom duration, pattern or intensity. May return `true` even if the device has no vibrator (if you want to check whether the device has a vibrator, see [`hasVibrator`](#hasVibrator)). ```dart if (await Vibration.hasCustomVibrationsSupport()) { Vibration.vibrate(duration: 1000); } else { Vibration.vibrate(); await Future.delayed(Duration(milliseconds: 500)); Vibration.vibrate(); } ``` ### vibrate #### Method Arguments - `duration`: Duration of the vibration in milliseconds. Default is 500ms. - `pattern`: List of integers representing the vibration pattern. Alternates between wait and vibrate durations. - `repeat`: Index in the pattern at which to repeat, or -1 for no repeat. Default is -1. - `intensities`: List of integers representing the vibration intensities for each segment in the pattern. - `amplitude`: Amplitude of the vibration. Range is 1 to 255. Default is -1 (use platform default). - `sharpness`: Sharpness of the vibration. iOS only. Range is 0.0 to 1.0. Default is 0.5. - `preset`: Predefined vibration preset. Overrides other parameters if provided. #### With specific duration (for example, 1 second): ```dart Vibration.vibrate(duration: 1000); ``` Default duration is 500ms. #### With specific duration and specific amplitude (if supported): ```dart Vibration.vibrate(duration: 1000, amplitude: 128); ``` #### With pattern (wait 500ms, vibrate 1s, wait 500ms, vibrate 2s): ```dart Vibration.vibrate(pattern: [500, 1000, 500, 2000]); ``` #### With pattern (wait 500ms, vibrate 1s, wait 500ms, vibrate 2s) at varying intensities (1 - min, 255 - max): ```dart Vibration.vibrate(pattern: [500, 1000, 500, 2000], intensities: [1, 255]); ``` #### With vibration presets: You can use predefined vibration presets for common use cases. ```dart Vibration.vibrate(preset: VibrationPreset.alarm); ``` Available presets: - `VibrationPreset.alarm` - `VibrationPreset.notification` - `VibrationPreset.heartbeat` - `VibrationPreset.singleShortBuzz` - `VibrationPreset.doubleBuzz` - `VibrationPreset.tripleBuzz` - `VibrationPreset.longAlarmBuzz` - `VibrationPreset.pulseWave` - `VibrationPreset.progressiveBuzz` - `VibrationPreset.rhythmicBuzz` - `VibrationPreset.gentleReminder` - `VibrationPreset.quickSuccessAlert` - `VibrationPreset.zigZagAlert` - `VibrationPreset.softPulse` - `VibrationPreset.emergencyAlert` - `VibrationPreset.heartbeatVibration` - `VibrationPreset.countdownTimerAlert` - `VibrationPreset.rapidTapFeedback` - `VibrationPreset.dramaticNotification` - `VibrationPreset.urgentBuzzWave` ### cancel Stop ongoing vibration. ```dart Vibration.cancel(); ``` ## Android The `VIBRATE` permission is required in AndroidManifest.xml. ```xml ``` Supports vibration with duration and pattern. On Android 8 (Oreo) and above, uses the [VibrationEffect](https://developer.android.com/reference/android/os/VibrationEffect) class. For the rest of the usage instructions, see [Vibrator](https://developer.android.com/reference/android/os/Vibrator) class documentation. ## iOS Supports vibration with duration and pattern on CoreHaptics devices. On older devices, the pattern is emulated with 500ms long vibrations. You can check whether the current device has CoreHaptics support using [`hasCustomVibrationsSupport`](#hasCustomVibrationsSupport). ## OpenHarmony The OpenHarmony implementation of [`vibration`][1]. [`vibration`][1] 在 OpenHarmony 平台的实现。 Add the following permission settings to your project's module.json5 file. 在你的项目的 `module.json5` 文件中增加以下权限设置。 ```json "requestPermissions": [ {"name" : "ohos.permission.VIBRATE"}, ] ``` ## Usage ```yaml dependencies: vibration: any vibration_ohos: any ``` `vibrateEffect` and `vibrateAttribute` are only exist in `VibrationOhos`. ```dart (VibrationPlatform.instance as VibrationOhos).vibrate( vibrateEffect: const VibratePreset(count: 100), vibrateAttribute: const VibrateAttribute( usage: 'alarm', ), ); ``` [1]: https://pub.dev/packages/vibration ================================================ FILE: vibration/analysis_options.yaml ================================================ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options ================================================ FILE: vibration/android/.gitignore ================================================ *.iml .gradle /local.properties /.idea/workspace.xml /.idea/libraries .DS_Store /build /captures .cxx ================================================ FILE: vibration/android/build.gradle ================================================ group = "com.benjaminabel.vibration" version = "1.0" buildscript { repositories { google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:8.1.0") } } rootProject.allprojects { repositories { google() mavenCentral() } } apply plugin: "com.android.library" android { namespace = "com.benjaminabel.vibration" compileSdk = 34 gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:deprecation" } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } defaultConfig { minSdk = 21 } dependencies { testImplementation("junit:junit:4.13.2") testImplementation("org.mockito:mockito-core:5.0.0") } testOptions { unitTests.all { testLogging { events "passed", "skipped", "failed", "standardOut", "standardError" outputs.upToDateWhen {false} showStandardStreams = true } } } } ================================================ FILE: vibration/android/settings.gradle ================================================ rootProject.name = 'vibration' ================================================ FILE: vibration/android/src/main/AndroidManifest.xml ================================================ ================================================ FILE: vibration/android/src/main/java/com/benjaminabel/vibration/Vibration.java ================================================ package com.benjaminabel.vibration; import android.os.Build; import android.os.VibrationEffect; import android.os.Vibrator; import android.media.AudioAttributes; import java.util.List; public class Vibration { private final Vibrator vibrator; Vibration(Vibrator vibrator) { this.vibrator = vibrator; } @SuppressWarnings("deprecation") void vibrate(long duration, int amplitude) { if (vibrator.hasVibrator()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (vibrator.hasAmplitudeControl()) { vibrator.vibrate(VibrationEffect.createOneShot(duration, amplitude), new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ALARM) .build()); } else { vibrator.vibrate(VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE), new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ALARM) .build()); } } else { vibrator.vibrate(duration); } } } @SuppressWarnings("deprecation") void vibrate(List pattern, int repeat) { long[] patternLong = new long[pattern.size()]; for (int i = 0; i < patternLong.length; i++) { patternLong[i] = pattern.get(i); } if (vibrator.hasVibrator()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { vibrator.vibrate(VibrationEffect.createWaveform(patternLong, repeat), new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ALARM) .build()); } else { vibrator.vibrate(patternLong, repeat); } } } @SuppressWarnings("deprecation") void vibrate(List pattern, int repeat, List intensities) { long[] patternLong = new long[pattern.size()]; int[] intensitiesArray = new int[intensities.size()]; for (int i = 0; i < patternLong.length; i++) { patternLong[i] = pattern.get(i); } for (int i = 0; i < intensitiesArray.length; i++) { intensitiesArray[i] = intensities.get(i); } if (vibrator.hasVibrator()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (vibrator.hasAmplitudeControl()) { vibrator.vibrate(VibrationEffect.createWaveform(patternLong, intensitiesArray, repeat), new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ALARM) .build()); } else { vibrator.vibrate(VibrationEffect.createWaveform(patternLong, repeat), new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ALARM) .build()); } } else { vibrator.vibrate(patternLong, repeat); } } } Vibrator getVibrator() { return this.vibrator; } } ================================================ FILE: vibration/android/src/main/java/com/benjaminabel/vibration/VibrationMethodChannelHandler.java ================================================ package com.benjaminabel.vibration; import android.os.Build; import androidx.annotation.NonNull; import java.util.List; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; class VibrationMethodChannelHandler implements MethodChannel.MethodCallHandler { private final Vibration vibration; VibrationMethodChannelHandler(Vibration vibrationPlugin) { assert (vibrationPlugin != null); this.vibration = vibrationPlugin; } @Override public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { switch (call.method) { case "hasAmplitudeControl": if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { result.success(vibration.getVibrator().hasAmplitudeControl()); } else { // For earlier API levels, return false rather than raising a // MissingPluginException in order to allow applications to handle // non-existence gracefully. result.success(false); } break; case "hasCustomVibrationsSupport": result.success(true); break; case "vibrate": Integer duration = call.argument("duration"); List pattern = call.argument("pattern"); Integer repeat = call.argument("repeat"); List intensities = call.argument("intensities"); Integer amplitude = call.argument("amplitude"); if (!pattern.isEmpty() && !intensities.isEmpty()) { vibration.vibrate(pattern, repeat, intensities); } else if (pattern.size() > 0) { vibration.vibrate(pattern, repeat); } else { vibration.vibrate(duration, amplitude); } result.success(null); break; case "cancel": vibration.getVibrator().cancel(); result.success(null); break; default: result.notImplemented(); } } } ================================================ FILE: vibration/android/src/main/java/com/benjaminabel/vibration/VibrationPlugin.java ================================================ package com.benjaminabel.vibration; import android.content.Context; import android.os.Vibrator; import android.os.Build; import android.os.VibratorManager; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.MethodChannel; public class VibrationPlugin implements FlutterPlugin { private static final String CHANNEL = "vibration"; private MethodChannel methodChannel; public Vibrator getVibrator(@NonNull FlutterPluginBinding flutterPluginBinding) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { return getLegacyVibrator(flutterPluginBinding); } else { try { final VibratorManager vibratorManager = (VibratorManager) flutterPluginBinding.getApplicationContext().getSystemService(Context.VIBRATOR_MANAGER_SERVICE); return vibratorManager.getDefaultVibrator(); } catch (NoSuchMethodError | NoClassDefFoundError error) { return getLegacyVibrator(flutterPluginBinding); } } } @SuppressWarnings("deprecation") private Vibrator getLegacyVibrator(@NonNull FlutterPluginBinding flutterPluginBinding) { final Context context = flutterPluginBinding.getApplicationContext(); Vibrator vibrator = ContextCompat.getSystemService(context, Vibrator.class); if (vibrator != null) { return vibrator; } return (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); } @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { final Vibrator vibrator = this.getVibrator(flutterPluginBinding); final VibrationMethodChannelHandler methodChannelHandler = new VibrationMethodChannelHandler(new Vibration(vibrator)); this.methodChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), CHANNEL); this.methodChannel.setMethodCallHandler(methodChannelHandler); } @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { this.methodChannel.setMethodCallHandler(null); this.methodChannel = null; } } ================================================ FILE: vibration/example/.gitignore ================================================ # Miscellaneous *.class *.log *.pyc *.swp .DS_Store .atom/ .build/ .buildlog/ .history .svn/ .swiftpm/ migrate_working_dir/ # IntelliJ related *.iml *.ipr *.iws .idea/ # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. #.vscode/ # Flutter/Dart/Pub related **/doc/api/ **/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins .flutter-plugins-dependencies .pub-cache/ .pub/ /build/ # Symbolication related app.*.symbols # Obfuscation related app.*.map.json # Android Studio will place build artifacts here /android/app/debug /android/app/profile /android/app/release ================================================ FILE: vibration/example/.metadata ================================================ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled and should not be manually edited. version: revision: "17025dd88227cd9532c33fa78f5250d548d87e9a" channel: "stable" project_type: app # Tracks metadata for the flutter migrate command migration: platforms: - platform: root create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a - platform: android create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a - platform: ios create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a # User provided section # List of Local paths (relative to this file) that should be # ignored by the migrate tool. # # Files that are not part of the templates will be ignored by default. unmanaged_files: - 'lib/main.dart' - 'ios/Runner.xcodeproj/project.pbxproj' ================================================ FILE: vibration/example/README.md ================================================ # example A new Flutter project. ## Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this is your first Flutter project: - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) For help getting started with Flutter development, view the [online documentation](https://docs.flutter.dev/), which offers tutorials, samples, guidance on mobile development, and a full API reference. ================================================ FILE: vibration/example/analysis_options.yaml ================================================ # This file configures the analyzer, which statically analyzes Dart code to # check for errors, warnings, and lints. # # The issues identified by the analyzer are surfaced in the UI of Dart-enabled # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be # invoked from the command line by running `flutter analyze`. # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` # included above or to enable additional rules. A list of all available lints # and their documentation is published at https://dart.dev/lints. # # Instead of disabling a lint rule for the entire project in the # section below, it can also be suppressed for a single line of code # or a specific dart file by using the `// ignore: name_of_lint` and # `// ignore_for_file: name_of_lint` syntax on the line or in the file # producing the lint. rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options ================================================ FILE: vibration/example/android/.gitignore ================================================ gradle-wrapper.jar /.gradle /captures/ /gradlew /gradlew.bat /local.properties GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks ================================================ FILE: vibration/example/android/app/build.gradle ================================================ plugins { id "com.android.application" id "kotlin-android" // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } android { namespace = "com.benjaminabel.vibration_example" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = JavaVersion.VERSION_17 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.benjaminabel.vibration_example" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig = signingConfigs.debug } } } flutter { source = "../.." } ================================================ FILE: vibration/example/android/app/src/debug/AndroidManifest.xml ================================================ ================================================ FILE: vibration/example/android/app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: vibration/example/android/app/src/main/java/com/example/example/MainActivity.java ================================================ package com.benjaminabel.vibration_example; import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { } ================================================ FILE: vibration/example/android/app/src/main/res/drawable/launch_background.xml ================================================ ================================================ FILE: vibration/example/android/app/src/main/res/drawable-v21/launch_background.xml ================================================ ================================================ FILE: vibration/example/android/app/src/main/res/values/styles.xml ================================================ ================================================ FILE: vibration/example/android/app/src/main/res/values-night/styles.xml ================================================ ================================================ FILE: vibration/example/android/app/src/profile/AndroidManifest.xml ================================================ ================================================ FILE: vibration/example/android/build.gradle ================================================ allprojects { repositories { google() mavenCentral() } } rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { delete rootProject.buildDir } ================================================ FILE: vibration/example/android/gradle/wrapper/gradle-wrapper.properties ================================================ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip ================================================ FILE: vibration/example/android/gradle.properties ================================================ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true ================================================ FILE: vibration/example/android/settings.gradle ================================================ pluginManagement { def flutterSdkPath = { def properties = new Properties() file("local.properties").withInputStream { properties.load(it) } def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath }() includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") repositories { google() mavenCentral() gradlePluginPortal() } } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version "8.12.1" apply false id "org.jetbrains.kotlin.android" version "2.2.0" apply false } include ":app" ================================================ FILE: vibration/example/ios/.gitignore ================================================ **/dgph *.mode1v3 *.mode2v3 *.moved-aside *.pbxuser *.perspectivev3 **/*sync/ .sconsign.dblite .tags* **/.vagrant/ **/DerivedData/ Icon? **/Pods/ **/.symlinks/ profile xcuserdata **/.generated/ Flutter/App.framework Flutter/Flutter.framework Flutter/Flutter.podspec Flutter/Generated.xcconfig Flutter/ephemeral/ Flutter/app.flx Flutter/app.zip Flutter/flutter_assets/ Flutter/flutter_export_environment.sh ServiceDefinitions.json Runner/GeneratedPluginRegistrant.* # Exceptions to above rules. !default.mode1v3 !default.mode2v3 !default.pbxuser !default.perspectivev3 ================================================ FILE: vibration/example/ios/Flutter/AppFrameworkInfo.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable App CFBundleIdentifier io.flutter.flutter.app CFBundleInfoDictionaryVersion 6.0 CFBundleName App CFBundlePackageType FMWK CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 MinimumOSVersion 13.0 ================================================ FILE: vibration/example/ios/Flutter/Debug.xcconfig ================================================ #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" ================================================ FILE: vibration/example/ios/Flutter/Flutter.podspec ================================================ # # This podspec is NOT to be published. It is only used as a local source! # This is a generated file; do not edit or check into version control. # Pod::Spec.new do |s| s.name = 'Flutter' s.version = '1.0.0' s.summary = 'A UI toolkit for beautiful and fast apps.' s.homepage = 'https://flutter.dev' s.license = { :type => 'BSD' } s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } s.ios.deployment_target = '13.0' # Framework linking is handled by Flutter tooling, not CocoaPods. # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. s.vendored_frameworks = 'path/to/nothing' end ================================================ FILE: vibration/example/ios/Flutter/Release.xcconfig ================================================ #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" ================================================ FILE: vibration/example/ios/Runner/AppDelegate.swift ================================================ import Flutter import UIKit @main @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { return super.application(application, didFinishLaunchingWithOptions: launchOptions) } func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) } } ================================================ FILE: vibration/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "size" : "20x20", "idiom" : "iphone", "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { "size" : "20x20", "idiom" : "iphone", "filename" : "Icon-App-20x20@3x.png", "scale" : "3x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "Icon-App-29x29@1x.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "Icon-App-29x29@3x.png", "scale" : "3x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "Icon-App-40x40@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "Icon-App-40x40@3x.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "Icon-App-60x60@2x.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "Icon-App-60x60@3x.png", "scale" : "3x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "Icon-App-20x20@1x.png", "scale" : "1x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "Icon-App-29x29@1x.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "Icon-App-40x40@1x.png", "scale" : "1x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "Icon-App-40x40@2x.png", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "Icon-App-76x76@1x.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "Icon-App-76x76@2x.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "Icon-App-83.5x83.5@2x.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", "filename" : "Icon-App-1024x1024@1x.png", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: vibration/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "LaunchImage.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "LaunchImage@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "LaunchImage@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: vibration/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md ================================================ # Launch Screen Assets You can customize the launch screen with your own desired assets by replacing the image files in this directory. You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. ================================================ FILE: vibration/example/ios/Runner/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: vibration/example/ios/Runner/Base.lproj/Main.storyboard ================================================ ================================================ FILE: vibration/example/ios/Runner/Info.plist ================================================ CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName Example CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName vibration_example CFBundlePackageType APPL CFBundleShortVersionString $(FLUTTER_BUILD_NAME) CFBundleSignature ???? CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS UIApplicationSceneManifest UIApplicationSupportsMultipleScenes UISceneConfigurations UIWindowSceneSessionRoleApplication UISceneClassName UIWindowScene UISceneConfigurationName flutter UISceneDelegateClassName FlutterSceneDelegate UISceneStoryboardFile Main UIApplicationSupportsIndirectInputEvents UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: vibration/example/ios/Runner/Runner-Bridging-Header.h ================================================ #import "GeneratedPluginRegistrant.h" ================================================ FILE: vibration/example/ios/Runner.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 97C146E61CF9000F007C117D /* Project object */; proxyType = 1; remoteGlobalIDString = 97C146ED1CF9000F007C117D; remoteInfo = Runner; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; DBE2CB966CC86F99F5476A4D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( 331C807B294A618700263BE5 /* RunnerTests.swift */, ); path = RunnerTests; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, ); name = Flutter; sourceTree = ""; }; 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, ); sourceTree = ""; }; 97C146EF1CF9000F007C117D /* Products */ = { isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, 331C8081294A63A400263BE5 /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; }; 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C147021CF9000F007C117D /* Info.plist */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); path = Runner; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 331C8080294A63A400263BE5 /* RunnerTests */ = { isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, DBE2CB966CC86F99F5476A4D /* Frameworks */, ); buildRules = ( ); dependencies = ( 331C8086294A63A400263BE5 /* PBXTargetDependency */, ); name = RunnerTests; productName = RunnerTests; productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ); buildRules = ( ); dependencies = ( ); name = Runner; packageProductDependencies = ( 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { CreatedOnToolsVersion = 14.0; TestTargetID = 97C146ED1CF9000F007C117D; }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 97C146E51CF9000F007C117D; packageReferences = ( 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, 331C8080294A63A400263BE5 /* RunnerTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 331C807F294A63A400263BE5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 97C146EC1CF9000F007C117D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Run Script"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 331C807D294A63A400263BE5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 97C146ED1CF9000F007C117D /* Runner */; targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 97C146FA1CF9000F007C117D /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 97C146FB1CF9000F007C117D /* Base */, ); name = Main.storyboard; sourceTree = ""; }; 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 97C147001CF9000F007C117D /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 249021D3217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Profile; }; 249021D4217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 3ZX4FWS39V; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = com.benjaminabel.vibration_example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.benjaminabel.vibration_example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; name = Debug; }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.benjaminabel.vibration_example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; name = Release; }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.benjaminabel.vibration_example.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; name = Profile; }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; 97C147061CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 3ZX4FWS39V; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = com.benjaminabel.vibration_example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; 97C147071CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = 3ZX4FWS39V; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = com.benjaminabel.vibration_example; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 331C8088294A63A400263BE5 /* Debug */, 331C8089294A63A400263BE5 /* Release */, 331C808A294A63A400263BE5 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( 97C147031CF9000F007C117D /* Debug */, 97C147041CF9000F007C117D /* Release */, 249021D3217E4FDB00AE95B9 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( 97C147061CF9000F007C117D /* Debug */, 97C147071CF9000F007C117D /* Release */, 249021D4217E4FDB00AE95B9 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; /* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { isa = XCSwiftPackageProductDependency; productName = FlutterGeneratedPluginSwiftPackage; }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } ================================================ FILE: vibration/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: vibration/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: vibration/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ================================================ PreviewsEnabled ================================================ FILE: vibration/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme ================================================ ================================================ FILE: vibration/example/ios/Runner.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: vibration/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: vibration/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ================================================ PreviewsEnabled ================================================ FILE: vibration/example/ios/RunnerTests/RunnerTests.swift ================================================ import Flutter import UIKit import XCTest class RunnerTests: XCTestCase { func testExample() { // If you add code to the Runner application, consider adding tests here. // See https://developer.apple.com/documentation/xctest for more information about using XCTest. } } ================================================ FILE: vibration/example/lib/main.dart ================================================ import 'package:flutter/material.dart'; import 'package:vibration/vibration.dart'; import 'package:vibration/vibration_presets.dart'; void main() => runApp(VibratingApp()); class VibratingApp extends StatelessWidget { const VibratingApp({super.key}); void showSnackBar( BuildContext context, { List pattern = const [], int duration = -1, }) { ScaffoldMessenger.of(context).removeCurrentSnackBar(); if (pattern.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( duration: Duration(milliseconds: duration), content: Text('Vibrate for ${duration}ms'), ), ); return; } ScaffoldMessenger.of(context).showSnackBar( SnackBar( duration: Duration( milliseconds: pattern.reduce( (value, element) => value + element, ), ), content: Text( pattern .map((e) => pattern.indexOf(e) % 2 == 0 ? 'wait ${e / 1000}s' : 'vibrate ${e / 1000}s') .join(', '), ), ), ); return; } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Center(child: Text('Vibration Plugin')), ), body: Builder( builder: (BuildContext context) { return Center( child: ListView( padding: const EdgeInsets.all(16.0), children: [ ElevatedButton( child: Text('Vibrate for default 500ms'), onPressed: () { showSnackBar(context, duration: 500); Vibration.vibrate(); }, ), ElevatedButton( child: Text('Vibrate for 1000ms'), onPressed: () { showSnackBar(context, duration: 1000); Vibration.vibrate(duration: 1000); }, ), ElevatedButton( child: Text('Vibrate with pattern'), onPressed: () { final List pattern = [ 500, 1000, 500, 2000, 500, 3000, 500, 500 ]; showSnackBar(context, pattern: pattern); Vibration.vibrate( pattern: pattern, ); }, ), ElevatedButton( child: Text('Vibrate with pattern and intensities'), onPressed: () { final List pattern = [ 500, 1000, 500, 2000, 500, 3000, 500, 500 ]; showSnackBar(context, pattern: pattern); Vibration.vibrate( pattern: pattern, intensities: [0, 128, 0, 255, 0, 64, 0, 255], ); }, ), SizedBox(height: 20), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( 'iOS only:', style: TextStyle(fontSize: 20), ), ), ), ElevatedButton( child: Text('Vibrate for 1000ms with 0.0 sharpness'), onPressed: () { showSnackBar(context, duration: 1000); Vibration.vibrate(duration: 1000, sharpness: 0.0); }, ), ElevatedButton( child: Text('Vibrate for 1000ms with 0.5 sharpness'), onPressed: () { showSnackBar(context, duration: 1000); Vibration.vibrate(duration: 1000, sharpness: 0.5); }, ), ElevatedButton( child: Text('Vibrate for 1000ms with 1.0 sharpness'), onPressed: () { showSnackBar(context, duration: 1000); Vibration.vibrate(duration: 1000, sharpness: 1.0); }, ), SizedBox(height: 20), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( 'Vibration Presets:', style: TextStyle(fontSize: 20), ), ), ), ElevatedButton( child: Text('Single Short Buzz'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.singleShortBuzz]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.singleShortBuzz, ); }, ), ElevatedButton( child: Text('Double Buzz'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.doubleBuzz]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.doubleBuzz, ); }, ), ElevatedButton( child: Text('Triple Buzz'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.tripleBuzz]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.tripleBuzz, ); }, ), ElevatedButton( child: Text('Long Alarm Buzz'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.longAlarmBuzz]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.longAlarmBuzz, ); }, ), ElevatedButton( child: Text('Pulse Wave'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.pulseWave]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.pulseWave, ); }, ), ElevatedButton( child: Text('Progressive Buzz'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.progressiveBuzz]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.progressiveBuzz, ); }, ), ElevatedButton( child: Text('Rhythmic Buzz'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.rhythmicBuzz]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.rhythmicBuzz, ); }, ), ElevatedButton( child: Text('Gentle Reminder'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.gentleReminder]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.gentleReminder, ); }, ), ElevatedButton( child: Text('Quick Success Alert'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.quickSuccessAlert]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.quickSuccessAlert, ); }, ), ElevatedButton( child: Text('Zig Zag Alert'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.zigZagAlert]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.zigZagAlert, ); }, ), ElevatedButton( child: Text('Soft Pulse'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.softPulse]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.softPulse, ); }, ), ElevatedButton( child: Text('Emergency Alert'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.emergencyAlert]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.emergencyAlert, ); }, ), ElevatedButton( child: Text('Heartbeat Vibration'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.heartbeatVibration]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.heartbeatVibration, ); }, ), ElevatedButton( child: Text('Countdown Timer Alert'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.countdownTimerAlert]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.countdownTimerAlert, ); }, ), ElevatedButton( child: Text('Rapid Tap Feedback'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.rapidTapFeedback]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.rapidTapFeedback, ); }, ), ElevatedButton( child: Text('Dramatic Notification'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.dramaticNotification]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.dramaticNotification, ); }, ), ElevatedButton( child: Text('Urgent Buzz Wave'), onPressed: () { final VibrationPresetConfig preset = presets[VibrationPreset.urgentBuzzWave]!; showSnackBar( context, pattern: preset.pattern, ); Vibration.vibrate( preset: VibrationPreset.urgentBuzzWave, ); }, ) ], ), ); }, ), ), ); } } ================================================ FILE: vibration/example/pubspec.yaml ================================================ name: vibration_example description: Demonstrates how to use the vibration plugin. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: "none" # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 # followed by an optional build number separated by a +. # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # In Android, build-name is used as versionName while build-number used as versionCode. # Read more about Android versioning at https://developer.android.com/studio/publish/versioning # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: sdk: ^3.0.0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions # consider running `flutter pub upgrade --major-versions`. Alternatively, # dependencies can be manually updated by changing the version numbers below to # the latest version available on pub.dev. To see which dependencies have newer # versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 vibration: path: ../ dev_dependencies: flutter_test: sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^5.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/to/resolution-aware-images # For details regarding adding assets from package dependencies, see # https://flutter.dev/to/asset-from-package # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts from package dependencies, # see https://flutter.dev/to/font-from-package ================================================ FILE: vibration/ios/.gitignore ================================================ .idea/ .vagrant/ .sconsign.dblite .svn/ .DS_Store *.swp profile DerivedData/ build/ GeneratedPluginRegistrant.h GeneratedPluginRegistrant.m .generated/ *.pbxuser *.mode1v3 *.mode2v3 *.perspectivev3 !default.pbxuser !default.mode1v3 !default.mode2v3 !default.perspectivev3 xcuserdata *.moved-aside *.pyc *sync/ Icon? .tags* /Flutter/Generated.xcconfig /Flutter/ephemeral/ /Flutter/flutter_export_environment.sh .build/ .swiftpm/ ================================================ FILE: vibration/ios/vibration/Package.swift ================================================ // swift-tools-version: 5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "vibration", platforms: [ .iOS("12.0"), ], products: [ .library(name: "vibration", targets: ["vibration"]) ], dependencies: [], targets: [ .target( name: "vibration", dependencies: [], resources: [ .process("Resources/PrivacyInfo.xcprivacy"), ] ) ] ) ================================================ FILE: vibration/ios/vibration/Sources/vibration/Resources/PrivacyInfo.xcprivacy ================================================ NSPrivacyTrackingDomains NSPrivacyAccessedAPITypes NSPrivacyCollectedDataTypes NSPrivacyTracking ================================================ FILE: vibration/ios/vibration/Sources/vibration/VibrationPlugin.swift ================================================ import AudioToolbox import CoreHaptics import Flutter import UIKit public class VibrationPlugin: NSObject, FlutterPlugin { #if targetEnvironment(simulator) private let isDevice = false #else private let isDevice = true #endif @available(iOS 13.0, *) public static var engine: CHHapticEngine? /// Monotonically-increasing counter used to invalidate in-flight repeat closures. /// Incrementing this value causes any `scheduleRepeat` closure that captured an older /// generation to exit without playing, effectively cancelling the active loop. @available(iOS 13.0, *) private static var repeatGeneration: Int = 0 public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: "vibration", binaryMessenger: registrar.messenger()) let instance = VibrationPlugin() if #available(iOS 13.0, *) { VibrationPlugin.createEngine() } registrar.addMethodCallDelegate(instance, channel: channel) } @available(iOS 13.0, *) public static func createEngine() { // Create and configure a haptic engine. do { VibrationPlugin.engine = try CHHapticEngine() } catch { print("Engine creation error: \(error)") return } if VibrationPlugin.engine == nil { print("Failed to create engine!") } // The stopped handler alerts you of engine stoppage due to external causes. // Cancel any active repeat loop for all stop reasons except .notifyWhenFinished, // which is an intentional completion and not applicable to our usage. VibrationPlugin.engine?.stoppedHandler = { reason in print("The engine stopped for reason: \(reason.rawValue)") if reason != .notifyWhenFinished { VibrationPlugin.repeatGeneration += 1 } } // The reset handler provides an opportunity for your app to restart the engine in case of failure. VibrationPlugin.engine?.resetHandler = { // Try restarting the engine. print("The engine reset --> Restarting now!") do { try VibrationPlugin.engine?.start() } catch { print("Failed to restart the engine: \(error)") } } } private func supportsHaptics() -> Bool { if #available(iOS 13.0, *) { return CHHapticEngine.capabilitiesForHardware().supportsHaptics } return false; } private func getAmplitude(myArgs: [String: Any]) -> Int { let amplitude = myArgs["amplitude"] as? Int ?? -1 return amplitude == -1 ? 255 : amplitude } private func getIntensities(myArgs: [String: Any]) -> [Int] { let intensities = myArgs["intensities"] as? [Int] ?? [] let amplitude = getAmplitude(myArgs: myArgs) let pattern = getPattern(myArgs: myArgs) if pattern.count == 1 { return [amplitude] } if (intensities.count == pattern.count) { return intensities } if intensities.count < pattern.count { return intensities + Array( repeating: intensities.last ?? amplitude, count: pattern.count - intensities.count ) } return pattern.enumerated().map { $0.offset % 2 == 0 ? 0 : amplitude } } private func getPattern(myArgs: [String: Any]) -> [Int] { let pattern = myArgs["pattern"] as? [Int] ?? [] if (pattern.isEmpty) { return [getDuration(myArgs: myArgs)] } return pattern } private func getDuration(myArgs: [String: Any]) -> Int { let duration = myArgs["duration"] as? Int ?? -1 return duration == -1 ? 500 : duration } private func getSharpness(myArgs: [String: Any]) -> Float { return myArgs["sharpness"] as? Float ?? 0.5 } /// Returns the repeat index from the method arguments, defaulting to `-1` (no repeat). /// A value of `0` loops the entire pattern; a value of `N` plays the full pattern once, /// then loops from index `N` onward on every subsequent iteration. private func getRepeat(myArgs: [String: Any]) -> Int { return myArgs["repeat"] as? Int ?? -1 } /// Builds an array of `CHHapticEvent` values from a slice of the pattern. /// /// - Parameters: /// - pattern: Timing values in milliseconds, alternating silence and vibration durations. /// - intensities: Amplitude values (0–255) corresponding to each element in `pattern`. /// - sharpness: Haptic sharpness applied to all vibration events. /// - startIndex: Index into `pattern` and `intensities` to begin from. Defaults to `0` /// (full pattern). Pass `repeatIndex` here when building loop-slice events. @available(iOS 13.0, *) private func buildHapticEvents( pattern: [Int], intensities: [Int], sharpness: Float, startIndex: Int = 0 ) -> [CHHapticEvent] { var hapticEvents: [CHHapticEvent] = [] var rel: Double = 0.0 for i in startIndex.. Void { let intensities = getIntensities(myArgs: myArgs) let patternArray = getPattern(myArgs: myArgs) let sharpness = getSharpness(myArgs: myArgs) let repeatIndex = getRepeat(myArgs: myArgs) do { let events = buildHapticEvents(pattern: patternArray, intensities: intensities, sharpness: sharpness) try playHapticEvents(events) } catch { print("Failed to play pattern: \(error.localizedDescription).") return } guard repeatIndex >= 0, repeatIndex < patternArray.count else { return } VibrationPlugin.repeatGeneration += 1 let gen = VibrationPlugin.repeatGeneration let firstPlayMs = patternArray.reduce(0, +) let loopSliceMs = patternArray[repeatIndex...].reduce(0, +) scheduleRepeat( pattern: patternArray, intensities: intensities, sharpness: sharpness, startIndex: repeatIndex, loopSliceMs: loopSliceMs, generation: gen, afterMs: firstPlayMs ) } @available(iOS 13.0, *) private func cancelVibration() { VibrationPlugin.repeatGeneration += 1 VibrationPlugin.engine?.stop(completionHandler: { error in if let error = error { print("Error stopping haptic engine: \(error)") } else { print("Haptic engine stopped successfully.") } }) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "hasCustomVibrationsSupport": result(supportsHaptics()) case "vibrate": guard let myArgs = call.arguments as? [String: Any] else { AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) result(true) return } if !supportsHaptics() { AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) result(true) return } if #available(iOS 13.0, *) { playPattern(myArgs: myArgs) result(true) return } AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) result(true) return case "cancel": if #available(iOS 13.0, *) { cancelVibration() } else { result(false) } result(true) return default: result(FlutterMethodNotImplemented) return } } } ================================================ FILE: vibration/ios/vibration.podspec ================================================ # # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. # Run `pod lib lint vibration.podspec` to validate before publishing. # Pod::Spec.new do |s| s.name = 'vibration' s.version = '3.0.0' s.summary = 'A plugin for handling Vibration API on iOS, Android, web and OpenHarmony.' s.description = <<-DESC A plugin for handling Vibration API on iOS, Android, web and OpenHarmony. DESC s.homepage = 'https://github.com/benjamindean/flutter_vibration' s.license = { :file => '../LICENSE' } s.author = { 'Benjamin Dean' => 'benjaminabel.cellardoor@gmail.com' } s.source = { :path => '.' } s.source_files = 'vibration/Sources/vibration/**/*.swift' s.dependency 'Flutter' s.platform = :ios, '12.0' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } s.swift_version = '5.0' s.resource_bundles = {'vibration_privacy' => ['vibration/Sources/vibration/Resources/PrivacyInfo.xcprivacy']} end ================================================ FILE: vibration/lib/vibration.dart ================================================ import 'dart:async'; import 'package:vibration/vibration_presets.dart'; import 'package:vibration_platform_interface/vibration_platform_interface.dart'; /// Platform-independent vibration methods. class Vibration { /// Check if vibrator is available on device. /// /// Returns `true` if the device has a vibrator, otherwise `false`. /// /// ```dart /// if (await Vibration.hasVibrator()) { /// Vibration.vibrate(); /// } /// ``` static Future hasVibrator() async { return await VibrationPlatform.instance.hasVibrator(); } /// Check if the vibrator has amplitude control. /// /// Returns `true` if the device supports amplitude control, otherwise `false`. /// /// ```dart /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(amplitude: 128); /// } /// ``` static Future hasAmplitudeControl() async { return await VibrationPlatform.instance.hasAmplitudeControl(); } /// Check if the device is able to vibrate with a custom /// [duration], [pattern], or [intensities]. /// /// Returns `true` if the device supports custom vibrations, otherwise `false`. /// /// ```dart /// if (await Vibration.hasCustomVibrationsSupport()) { /// Vibration.vibrate(duration: 1000); /// } else { /// Vibration.vibrate(); /// await Future.delayed(Duration(milliseconds: 500)); /// Vibration.vibrate(); /// } /// ``` static Future hasCustomVibrationsSupport() async { return await VibrationPlatform.instance.hasCustomVibrationsSupport(); } /// Vibrate with [duration] at [amplitude] or [pattern] at [intensities]. /// /// The default vibration duration is 500ms. /// Amplitude is a range from 1 to 255, if supported. /// /// If [preset] is provided, it overrides other parameters and uses the preset configuration. /// /// ```dart /// Vibration.vibrate(duration: 1000); /// /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(duration: 1000, amplitude: 1); /// Vibration.vibrate(duration: 1000, amplitude: 255); /// } /// /// Vibration.vibrate(preset: VibrationPreset.quickSuccessAlert); /// ``` static Future vibrate({ int duration = 500, List pattern = const [], int repeat = -1, List intensities = const [], int amplitude = -1, // sharpness is iOS only double sharpness = 0.5, VibrationPreset? preset, }) async { if (preset != null) { final VibrationPresetConfig? vibrationPreset = presets[preset]; if (vibrationPreset == null) { throw ArgumentError('Invalid preset: $preset'); } return VibrationPlatform.instance.vibrate( pattern: vibrationPreset.pattern, intensities: vibrationPreset.intensities, ); } return VibrationPlatform.instance.vibrate( duration: duration, pattern: pattern, repeat: repeat, intensities: intensities, amplitude: amplitude, sharpness: sharpness, ); } /// Cancel an ongoing vibration. /// /// This method stops any ongoing vibration. /// On iOS, it only works for custom haptic vibrations using `CHHapticEngine`. /// /// ```dart /// Vibration.vibrate(duration: 10000); /// Vibration.cancel(); /// ``` static Future cancel() async { return VibrationPlatform.instance.cancel(); } } ================================================ FILE: vibration/lib/vibration_presets.dart ================================================ /// Configuration for a vibration preset. class VibrationPresetConfig { /// The pattern of the vibration in milliseconds. final List pattern; /// The intensities of the vibration, ranging from 0 to 255. final List intensities; /// Creates a new vibration preset configuration. const VibrationPresetConfig({ required this.pattern, required this.intensities, }); } /// Enum representing different vibration presets. enum VibrationPreset { singleShortBuzz, doubleBuzz, tripleBuzz, longAlarmBuzz, pulseWave, progressiveBuzz, rhythmicBuzz, gentleReminder, quickSuccessAlert, zigZagAlert, softPulse, emergencyAlert, heartbeatVibration, countdownTimerAlert, rapidTapFeedback, dramaticNotification, urgentBuzzWave, } /// A map of vibration presets to their configurations. final Map presets = { VibrationPreset.singleShortBuzz: VibrationPresetConfig( pattern: [0, 100], intensities: [0, 255], ), VibrationPreset.doubleBuzz: VibrationPresetConfig( pattern: [0, 100, 50, 100], intensities: [0, 255, 0, 255], ), VibrationPreset.tripleBuzz: VibrationPresetConfig( pattern: [0, 100, 50, 100, 50, 100], intensities: [0, 255, 0, 255, 0, 255], ), VibrationPreset.longAlarmBuzz: VibrationPresetConfig( pattern: [0, 500], intensities: [0, 255], ), VibrationPreset.pulseWave: VibrationPresetConfig( pattern: [0, 100, 100, 100, 100, 100], intensities: [0, 200, 0, 200, 0, 200], ), VibrationPreset.progressiveBuzz: VibrationPresetConfig( pattern: [0, 100, 200, 300, 400, 500], intensities: [0, 100, 150, 200, 255, 255], ), VibrationPreset.rhythmicBuzz: VibrationPresetConfig( pattern: [0, 200, 100, 300, 100, 200], intensities: [0, 150, 0, 255, 0, 200], ), VibrationPreset.gentleReminder: VibrationPresetConfig( pattern: [0, 50, 100, 50, 100, 50], intensities: [0, 128, 0, 128, 0, 128], ), VibrationPreset.quickSuccessAlert: VibrationPresetConfig( pattern: [0, 70, 30, 70, 30, 70], intensities: [0, 255, 0, 255, 0, 255], ), VibrationPreset.zigZagAlert: VibrationPresetConfig( pattern: [0, 100, 30, 300, 30, 100], intensities: [0, 200, 0, 255, 0, 200], ), VibrationPreset.softPulse: VibrationPresetConfig( pattern: [0, 150, 50, 150, 50, 150], intensities: [0, 100, 0, 100, 0, 100], ), VibrationPreset.emergencyAlert: VibrationPresetConfig( pattern: [0, 500, 50, 500, 50, 500], intensities: [0, 255, 0, 255, 0, 255], ), VibrationPreset.heartbeatVibration: VibrationPresetConfig( pattern: [0, 200, 100, 100, 100, 200], intensities: [0, 255, 0, 100, 0, 255], ), VibrationPreset.countdownTimerAlert: VibrationPresetConfig( pattern: [0, 100, 100, 200, 100, 300, 100, 400, 100, 500], intensities: [0, 100, 0, 150, 0, 200, 0, 255, 0, 255], ), VibrationPreset.rapidTapFeedback: VibrationPresetConfig( pattern: [0, 50, 50, 50, 50, 50, 50, 50], intensities: [0, 180, 0, 180, 0, 180, 0, 180], ), VibrationPreset.dramaticNotification: VibrationPresetConfig( pattern: [0, 100, 200, 100, 300, 100, 400], intensities: [0, 255, 0, 200, 0, 150, 0], ), VibrationPreset.urgentBuzzWave: VibrationPresetConfig( pattern: [0, 300, 50, 300, 50, 300, 50, 300], intensities: [0, 255, 0, 230, 0, 210, 0, 200], ), }; ================================================ FILE: vibration/pubspec.yaml ================================================ name: vibration description: A plugin for handling Vibration API on iOS, Android, web and OpenHarmony. version: 3.1.8 homepage: https://github.com/benjamindean/flutter_vibration environment: sdk: ">=3.0.0 <4.0.0" flutter: ">=3.0.0" dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.0.2 vibration_platform_interface: ^0.1.1 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # This section identifies this Flutter project as a plugin project. # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) # which should be registered in the plugin registry. This is required for # using method channels. # The Android 'package' specifies package in which the registered class is. # This is required for using method channels on Android. # The 'ffiPlugin' specifies that native code should be built and bundled. # This is required for using `dart:ffi`. # All these are used by the tooling to maintain consistency when # adding or updating assets for this project. plugin: platforms: android: package: com.benjaminabel.vibration pluginClass: VibrationPlugin ios: pluginClass: VibrationPlugin # To add assets to your plugin package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # # For details regarding assets in packages, see # https://flutter.dev/to/asset-from-package # # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/to/resolution-aware-images # To add custom fonts to your plugin package, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts in packages, see # https://flutter.dev/to/font-from-package ================================================ FILE: vibration/test/vibration_test.dart ================================================ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:vibration/vibration.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); const MethodChannel channel = MethodChannel('vibration'); final List log = []; setUp(() { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (MethodCall methodCall) { log.add(methodCall); return null; }); }); tearDown(() { log.clear(); }); group('hasVibrator', () { test( 'returns false', () async { bool? hasVibrator = await Vibration.hasVibrator(); expect( hasVibrator, equals(false), ); }, ); test('throws PlatformException', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (MethodCall methodCall) async { throw PlatformException(code: 'error'); }); final hasVibrator = await Vibration.hasVibrator(); throwsA(isA()); expect(hasVibrator, isFalse); }); test('throws UnsupportedError', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (MethodCall methodCall) async { throw UnsupportedError('error'); }); final hasVibrator = await Vibration.hasVibrator(); throwsA(isA()); expect(hasVibrator, isFalse); }); }); group('hasAmplitudeControl', () { test( 'returns false', () async { bool? hasAmplitudeControl = await Vibration.hasAmplitudeControl(); expect(hasAmplitudeControl, isFalse); }, ); test('throws PlatformException', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (MethodCall methodCall) async { throw PlatformException(code: 'error'); }); final hasAmplitudeControl = await Vibration.hasAmplitudeControl(); throwsA(isA()); expect(hasAmplitudeControl, isFalse); }); test('throws UnsupportedError', () async { TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (MethodCall methodCall) async { throw UnsupportedError('error'); }); final hasAmplitudeControl = await Vibration.hasAmplitudeControl(); throwsA(isA()); expect(hasAmplitudeControl, isFalse); }); }); test( 'vibrate with duration', () async { await Vibration.vibrate(duration: 100); expect( log, [ isMethodCall('vibrate', arguments: { 'duration': 100, 'pattern': [], 'repeat': -1, 'amplitude': -1, 'intensities': [], 'sharpness': 0.5, }) ], ); }, ); test( 'vibrate with pattern', () async { await Vibration.vibrate(pattern: [100, 200, 400], repeat: 1); expect( log, [ isMethodCall('vibrate', arguments: { 'duration': 500, 'pattern': [100, 200, 400], 'repeat': 1, 'amplitude': -1, 'intensities': [], 'sharpness': 0.5, }) ], ); }, ); test( 'cancel vibration', () async { await Vibration.cancel(); expect( log, [isMethodCall('cancel', arguments: null)], ); }, ); } ================================================ FILE: vibration.iml ================================================ ================================================ FILE: vibration_ohos/.gitignore ================================================ # Miscellaneous *.class *.log *.pyc *.swp .DS_Store .atom/ .buildlog/ .history .svn/ migrate_working_dir/ # IntelliJ related *.iml *.ipr *.iws .idea/ # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. #.vscode/ # Flutter/Dart/Pub related # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. /pubspec.lock **/doc/api/ .dart_tool/ .packages build/ .hvigor dependencies oh_modules local.properties .metadata oh-package-lock.json5 ================================================ FILE: vibration_ohos/CHANGELOG.md ================================================ ## 0.0.4 * Bump package `device_info_plus_ohos` to ">=0.0.7 <1.0.0" * Bump package `vibration_platform_interface` to "0.1.1" ## 0.0.3 * Update vibration_platform_interface ## 0.0.2 * Bump package `vibration_platform_interface` to "0.0.2" ## 0.0.1 * Support OpenHarmony. ================================================ FILE: vibration_ohos/LICENSE ================================================ BSD 2-Clause License Copyright (c) 2018, Benjamin Dean All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vibration_ohos/README.md ================================================ # vibration_ohos The OpenHarmony implementation of [`vibration`][1]. [`vibration`][1] 在 OpenHarmony 平台的实现。 Add the following permission settings to your project's module.json5 file. 在你的项目的 `module.json5` 文件中增加以下权限设置。 ```json "requestPermissions": [ {"name" : "ohos.permission.VIBRATE"}, ] ``` ## Usage ```yaml dependencies: vibration: any vibration_ohos: any ``` `vibrateEffect` and `vibrateAttribute` are only exist in `VibrationOhos`. ```dart (VibrationPlatform.instance as VibrationOhos).vibrate( vibrateEffect: const VibratePreset(count: 100), vibrateAttribute: const VibrateAttribute( usage: 'alarm', ), ); ``` [1]: https://pub.dev/packages/vibration ================================================ FILE: vibration_ohos/analysis_options.yaml ================================================ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options ================================================ FILE: vibration_ohos/example/.gitignore ================================================ # Miscellaneous *.class *.log *.pyc *.swp .DS_Store .atom/ .buildlog/ .history .svn/ migrate_working_dir/ # IntelliJ related *.iml *.ipr *.iws .idea/ # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. #.vscode/ # Flutter/Dart/Pub related **/doc/api/ **/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins .flutter-plugins-dependencies .packages .pub-cache/ .pub/ /build/ # Symbolication related app.*.symbols # Obfuscation related app.*.map.json # Android Studio will place build artifacts here /android/app/debug /android/app/profile /android/app/release .metadata pubspec.lock ================================================ FILE: vibration_ohos/example/README.md ================================================ # vibration_ohos_example Demonstrates how to use the vibration_ohos plugin. ## Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this is your first Flutter project: - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) For help getting started with Flutter development, view the [online documentation](https://docs.flutter.dev/), which offers tutorials, samples, guidance on mobile development, and a full API reference. ================================================ FILE: vibration_ohos/example/analysis_options.yaml ================================================ # This file configures the analyzer, which statically analyzes Dart code to # check for errors, warnings, and lints. # # The issues identified by the analyzer are surfaced in the UI of Dart-enabled # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be # invoked from the command line by running `flutter analyze`. # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` # included above or to enable additional rules. A list of all available lints # and their documentation is published at # https://dart-lang.github.io/linter/lints/index.html. # # Instead of disabling a lint rule for the entire project in the # section below, it can also be suppressed for a single line of code # or a specific dart file by using the `// ignore: name_of_lint` and # `// ignore_for_file: name_of_lint` syntax on the line or in the file # producing the lint. rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options ================================================ FILE: vibration_ohos/example/assets/haptic_file.json ================================================ { "MetaData": { "Create": "2023-01-09", "Description": "a haptic case", "Version": 1.0, "ChannelNumber": 1 }, "Channels": [ { "Parameters": { "Index": 1 }, "Pattern": [ { "Event": { "Type": "transient", "StartTime": 0, "Parameters": { "Intensity": 100, "Frequency": 31 } } }, { "Event": { "Type": "continuous", "StartTime": 100, "Duration": 54, "Parameters": { "Intensity": 38, "Frequency": 30 } } } ] } ] } ================================================ FILE: vibration_ohos/example/lib/main.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_platform_utils/flutter_platform_utils.dart'; import 'package:vibration/vibration.dart'; import 'package:vibration_ohos/vibration_ohos.dart'; void main() => runApp(const VibratingApp()); class VibratingApp extends StatelessWidget { const VibratingApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Vibration Plugin example app'), ), body: Builder( builder: (BuildContext context) { return Center( child: Column( children: [ ElevatedButton( child: const Text('Vibrate for default 500ms'), onPressed: () { Vibration.vibrate(); }, ), ElevatedButton( child: const Text('Vibrate for 1000ms'), onPressed: () { Vibration.vibrate(duration: 1000); }, ), if (!PlatformUtils.isOhos) ElevatedButton( child: const Text('Vibrate with pattern'), onPressed: () { const snackBar = SnackBar( content: Text( 'Pattern: wait 0.5s, vibrate 1s, wait 0.5s, vibrate 2s, wait 0.5s, vibrate 3s, wait 0.5s, vibrate 0.5s', ), ); ScaffoldMessenger.of(context).showSnackBar(snackBar); Vibration.vibrate( pattern: [500, 1000, 500, 2000, 500, 3000, 500, 500], ); }, ), if (!PlatformUtils.isOhos) ElevatedButton( child: const Text('Vibrate with pattern and amplitude'), onPressed: () { const snackBar = SnackBar( content: Text( 'Pattern: wait 0.5s, vibrate 1s, wait 0.5s, vibrate 2s, wait 0.5s, vibrate 3s, wait 0.5s, vibrate 0.5s', ), ); ScaffoldMessenger.of(context).showSnackBar(snackBar); Vibration.vibrate( pattern: [500, 1000, 500, 2000, 500, 3000, 500, 500], intensities: [0, 128, 0, 255, 0, 64, 0, 255], ); }, ), if (PlatformUtils.isOhos) ElevatedButton( child: const Text('Vibrate with VibratePreset'), onPressed: () { (VibrationPlatform.instance as VibrationOhos).vibrate( vibrateEffect: const VibratePreset(count: 100), vibrateAttribute: const VibrateAttribute( usage: 'alarm', ), ); }, ), // ohos only // TODO: not support for now if (PlatformUtils.isOhos) ElevatedButton( child: const Text('Vibrate with custom haptic_file'), onPressed: () { rootBundle.load('assets/haptic_file.json').then((data) { (VibrationPlatform.instance as VibrationOhos).vibrate( vibrateEffect: VibrateFromFile( hapticFd: HapticFileDescriptor( data: data.buffer.asUint8List(), ), ), vibrateAttribute: const VibrateAttribute( usage: 'alarm', ), ); }); }, ) ], ), ); }, ), ), ); } } ================================================ FILE: vibration_ohos/example/ohos/.gitignore ================================================ /node_modules /oh_modules /local.properties /.idea **/build /.hvigor .cxx /.clangd /.clang-format /.clang-tidy **/.test *.har **/BuildProfile.ets **/oh-package-lock.json5 **/src/main/resources/rawfile/flutter_assets/ **/libs/arm64-v8a/libapp.so **/libs/arm64-v8a/libflutter.so **/libs/arm64-v8a/libvmservice_snapshot.so har/flutter.har oh-package-lock.json5 dta ================================================ FILE: vibration_ohos/example/ohos/AppScope/app.json5 ================================================ { "app": { "bundleName": "com.example.example", "vendor": "example", "versionCode": 1000000, "versionName": "1.0.0", "icon": "$media:app_icon", "label": "$string:app_name" } } ================================================ FILE: vibration_ohos/example/ohos/AppScope/resources/base/element/string.json ================================================ { "string": [ { "name": "app_name", "value": "example" } ] } ================================================ FILE: vibration_ohos/example/ohos/build-profile.json5 ================================================ { "app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compileSdkVersion": "4.1.0(11)", "compatibleSdkVersion": "4.1.0(11)", "runtimeOS": "HarmonyOS" } ] }, "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [ { "name": "default", "applyToProducts": [ "default" ] } ] } ] } ================================================ FILE: vibration_ohos/example/ohos/entry/.gitignore ================================================ /node_modules /oh_modules /.preview /build /.cxx /.test /har /libs oh-package-lock.json5 ================================================ FILE: vibration_ohos/example/ohos/entry/build-profile.json5 ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ { "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default", "runtimeOS": "HarmonyOS" }, { "name": "ohosTest", } ] } ================================================ FILE: vibration_ohos/example/ohos/entry/hvigorfile.ts ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. export { hapTasks } from '@ohos/hvigor-ohos-plugin'; ================================================ FILE: vibration_ohos/example/ohos/entry/oh-package.json5 ================================================ { "name": "entry", "version": "1.0.0", "description": "Please describe the basic information.", "main": "", "author": "", "license": "", "dependencies": { "device_info_plus_ohos": "file:../har/device_info_plus_ohos.har", "vibration_ohos": "file:../har/vibration_ohos.har" } } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/ets/entryability/EntryAbility.ets ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { FlutterAbility, FlutterEngine } from '@ohos/flutter_ohos'; import { GeneratedPluginRegistrant } from '../plugins/GeneratedPluginRegistrant'; export default class EntryAbility extends FlutterAbility { configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) GeneratedPluginRegistrant.registerWith(flutterEngine) } } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/ets/pages/Index.ets ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import common from '@ohos.app.ability.common'; import { FlutterPage } from '@ohos/flutter_ohos' let storage = LocalStorage.getShared() const EVENT_BACK_PRESS = 'EVENT_BACK_PRESS' @Entry(storage) @Component struct Index { private context = getContext(this) as common.UIAbilityContext @LocalStorageLink('viewId') viewId: string = ""; build() { Column() { FlutterPage({ viewId: this.viewId }) } } onBackPress(): boolean { this.context.eventHub.emit(EVENT_BACK_PRESS) return true } } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets ================================================ import { FlutterEngine, Log } from '@ohos/flutter_ohos'; import DeviceInfoPlusPlugin from 'device_info_plus_ohos'; import VibrationPlugin from 'vibration_ohos'; /** * Generated file. Do not edit. * This file is generated by the Flutter tool based on the * plugins that support the Ohos platform. */ const TAG = "GeneratedPluginRegistrant"; export class GeneratedPluginRegistrant { static registerWith(flutterEngine: FlutterEngine) { try { flutterEngine.getPlugins()?.add(new DeviceInfoPlusPlugin()); flutterEngine.getPlugins()?.add(new VibrationPlugin()); } catch (e) { Log.e( TAG, "Tried to register plugins with FlutterEngine (" + flutterEngine + ") failed."); Log.e(TAG, "Received exception while registering", e); } } } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/module.json5 ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ { "module": { "name": "entry", "type": "entry", "description": "$string:module_desc", "mainElement": "EntryAbility", "deviceTypes": [ "phone" ], "deliveryWithInstall": true, "installationFree": false, "pages": "$profile:main_pages", "abilities": [ { "name": "EntryAbility", "srcEntry": "./ets/entryability/EntryAbility.ets", "description": "$string:EntryAbility_desc", "icon": "$media:icon", "label": "$string:EntryAbility_label", "startWindowIcon": "$media:icon", "startWindowBackground": "$color:start_window_background", "exported": true, "skills": [ { "entities": [ "entity.system.home" ], "actions": [ "action.system.home" ] } ] } ], "requestPermissions": [ {"name" : "ohos.permission.INTERNET"}, {"name" : "ohos.permission.VIBRATE"}, ] } } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/resources/base/element/color.json ================================================ { "color": [ { "name": "start_window_background", "value": "#FFFFFF" } ] } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/resources/base/element/string.json ================================================ { "string": [ { "name": "module_desc", "value": "module description" }, { "name": "EntryAbility_desc", "value": "description" }, { "name": "EntryAbility_label", "value": "example" } ] } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/resources/base/profile/main_pages.json ================================================ { "src": [ "pages/Index" ] } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/resources/en_US/element/string.json ================================================ { "string": [ { "name": "module_desc", "value": "module description" }, { "name": "EntryAbility_desc", "value": "description" }, { "name": "EntryAbility_label", "value": "example" } ] } ================================================ FILE: vibration_ohos/example/ohos/entry/src/main/resources/zh_CN/element/string.json ================================================ { "string": [ { "name": "module_desc", "value": "模块描述" }, { "name": "EntryAbility_desc", "value": "description" }, { "name": "EntryAbility_label", "value": "example" } ] } ================================================ FILE: vibration_ohos/example/ohos/hvigor/hvigor-config.json5 ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ { "hvigorVersion": "4.1.2", "dependencies": { "@ohos/hvigor-ohos-plugin": "4.1.2" } } ================================================ FILE: vibration_ohos/example/ohos/hvigor/hvigor-wrapper.js ================================================ "use strict";var e=require("path"),t=require("os"),n=require("fs"),r=require("child_process"),u=require("process"),o=require("tty"),i=require("util"),s=require("url"),a=require("constants"),c=require("stream"),l=require("assert"),f=require("zlib"),D=require("net"),d=require("crypto"),p="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},E={},h={},C=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(h,"__esModule",{value:!0}),h.maxPathLength=h.isMac=h.isLinux=h.isWindows=void 0;const m=C(t),F="Windows_NT",y="Darwin";function g(){return m.default.type()===F}function A(){return m.default.type()===y}h.isWindows=g,h.isLinux=function(){return"Linux"===m.default.type()},h.isMac=A,h.maxPathLength=function(){return A()?1016:g()?259:4095},function(n){var r=p&&p.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),u=p&&p.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=p&&p.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return u(t,e),t};Object.defineProperty(n,"__esModule",{value:!0}),n.LOG_LEVEL=n.ANALYZE=n.PARALLEL=n.INCREMENTAL=n.DAEMON=n.DOT=n.PROPERTIES=n.HVIGOR_POOL_CACHE_TTL=n.HVIGOR_POOL_CACHE_CAPACITY=n.HVIGOR_POOL_MAX_CORE_SIZE=n.HVIGOR_POOL_MAX_SIZE=n.ENABLE_SIGN_TASK_KEY=n.HVIGOR_CACHE_DIR_KEY=n.WORK_SPACE=n.HVIGOR_PROJECT_WRAPPER_HOME=n.HVIGOR_PROJECT_ROOT_DIR=n.HVIGOR_PROJECT_CACHES_HOME=n.HVIGOR_PNPM_STORE_PATH=n.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=n.PROJECT_CACHES=n.HVIGOR_WRAPPER_TOOLS_HOME=n.HVIGOR_USER_HOME=n.DEFAULT_PACKAGE_JSON=n.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=n.PNPM=n.HVIGOR=n.NPM_TOOL=n.PNPM_TOOL=n.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const i=o(t),s=o(e),a=h;n.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",n.PNPM_TOOL=(0,a.isWindows)()?"pnpm.cmd":"pnpm",n.NPM_TOOL=(0,a.isWindows)()?"npm.cmd":"npm",n.HVIGOR="hvigor",n.PNPM="pnpm",n.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",n.DEFAULT_PACKAGE_JSON="package.json",n.HVIGOR_USER_HOME=s.resolve(i.homedir(),".hvigor"),n.HVIGOR_WRAPPER_TOOLS_HOME=s.resolve(n.HVIGOR_USER_HOME,"wrapper","tools"),n.PROJECT_CACHES="project_caches",n.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=s.resolve(n.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",n.PNPM_TOOL),n.HVIGOR_PNPM_STORE_PATH=s.resolve(n.HVIGOR_USER_HOME,"caches"),n.HVIGOR_PROJECT_CACHES_HOME=s.resolve(n.HVIGOR_USER_HOME,n.PROJECT_CACHES),n.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),n.HVIGOR_PROJECT_WRAPPER_HOME=s.resolve(n.HVIGOR_PROJECT_ROOT_DIR,n.HVIGOR),n.WORK_SPACE="workspace",n.HVIGOR_CACHE_DIR_KEY="hvigor.cacheDir",n.ENABLE_SIGN_TASK_KEY="enableSignTask",n.HVIGOR_POOL_MAX_SIZE="hvigor.pool.maxSize",n.HVIGOR_POOL_MAX_CORE_SIZE="hvigor.pool.maxCoreSize",n.HVIGOR_POOL_CACHE_CAPACITY="hvigor.pool.cache.capacity",n.HVIGOR_POOL_CACHE_TTL="hvigor.pool.cache.ttl",n.PROPERTIES="properties",n.DOT=".",n.DAEMON="daemon",n.INCREMENTAL="incremental",n.PARALLEL="typeCheck",n.ANALYZE="analyze",n.LOG_LEVEL="logLevel"}(E);var v={},S={};Object.defineProperty(S,"__esModule",{value:!0}),S.logError=S.logInfo=S.logErrorAndExit=void 0,S.logErrorAndExit=function(e){e instanceof Error?console.error(e.message):console.error(e),process.exit(-1)},S.logInfo=function(e){console.log(e)},S.logError=function(e){console.error(e)};var w=p&&p.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),O=p&&p.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),_=p&&p.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&w(t,e,n);return O(t,e),t};Object.defineProperty(v,"__esModule",{value:!0});var b=v.executeBuild=void 0;const B=_(n),x=_(e),P=S,I=r;b=v.executeBuild=function(e){const t=x.resolve(e,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const e=B.realpathSync(t),n=process.argv.slice(2),r=(0,I.spawn)("node",[e,...n],{env:process.env});r.stdout.on("data",(e=>{(0,P.logInfo)(`${e.toString().trim()}`)})),r.stderr.on("data",(e=>{(0,P.logError)(`${e.toString().trim()}`)})),r.on("exit",((e,t)=>{process.exit(null!=e?e:-1)}))}catch(n){(0,P.logErrorAndExit)(`Error: ENOENT: no such file ${t},delete ${e} and retry.`)}};var N,T,k,R,M,L={},j={},$={exports:{}},H={exports:{}};function G(){if(T)return N;T=1;var e=1e3,t=60*e,n=60*t,r=24*n,u=7*r,o=365.25*r;function i(e,t,n,r){var u=t>=1.5*n;return Math.round(e/n)+" "+r+(u?"s":"")}return N=function(s,a){a=a||{};var c=typeof s;if("string"===c&&s.length>0)return function(i){if((i=String(i)).length>100)return;var s=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(i);if(!s)return;var a=parseFloat(s[1]);switch((s[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return a*o;case"weeks":case"week":case"w":return a*u;case"days":case"day":case"d":return a*r;case"hours":case"hour":case"hrs":case"hr":case"h":return a*n;case"minutes":case"minute":case"mins":case"min":case"m":return a*t;case"seconds":case"second":case"secs":case"sec":case"s":return a*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}(s);if("number"===c&&isFinite(s))return a.long?function(u){var o=Math.abs(u);if(o>=r)return i(u,o,r,"day");if(o>=n)return i(u,o,n,"hour");if(o>=t)return i(u,o,t,"minute");if(o>=e)return i(u,o,e,"second");return u+" ms"}(s):function(u){var o=Math.abs(u);if(o>=r)return Math.round(u/r)+"d";if(o>=n)return Math.round(u/n)+"h";if(o>=t)return Math.round(u/t)+"m";if(o>=e)return Math.round(u/e)+"s";return u+"ms"}(s);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(s))}}function V(){if(R)return k;return R=1,k=function(e){function t(e){let r,u,o,i=null;function s(...e){if(!s.enabled)return;const n=s,u=Number(new Date),o=u-(r||u);n.diff=o,n.prev=r,n.curr=u,r=u,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let i=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,u)=>{if("%%"===r)return"%";i++;const o=t.formatters[u];if("function"==typeof o){const t=e[i];r=o.call(n,t),e.splice(i,1),i--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return s.namespace=e,s.useColors=t.useColors(),s.color=t.selectColor(e),s.extend=n,s.destroy=t.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==i?i:(u!==t.namespaces&&(u=t.namespaces,o=t.enabled(e)),o),set:e=>{i=e}}),"function"==typeof t.init&&t.init(s),s}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),u=r.length;for(n=0;n{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t{t=t||process.argv;const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),u=t.indexOf("--");return-1!==r&&(-1===u||r=8&&Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in r)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some((e=>e in r))||"codeship"===r.CI_NAME?1:o;if("TEAMCITY_VERSION"in r)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(r.TEAMCITY_VERSION)?1:0;if("truecolor"===r.COLORTERM)return 3;if("TERM_PROGRAM"in r){const e=parseInt((r.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(r.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(r.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(r.TERM)||"COLORTERM"in r?1:(r.TERM,o)}(t);return function(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}(o)}return n("no-color")||n("no-colors")||n("color=false")?u=!1:(n("color")||n("colors")||n("color=true")||n("color=always"))&&(u=!0),"FORCE_COLOR"in r&&(u=0===r.FORCE_COLOR.length||0!==parseInt(r.FORCE_COLOR,10)),W={supportsColor:o,stdout:o(process.stdout),stderr:o(process.stderr)}}function Q(){return K||(K=1,function(e,t){const n=o,r=i;t.init=function(e){e.inspectOpts={};const n=Object.keys(t.inspectOpts);for(let r=0;r{}),"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),t.colors=[6,2,3,4,5,1];try{const e=X();e&&(e.stderr||e).level>=2&&(t.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(e){}t.inspectOpts=Object.keys(process.env).filter((e=>/^debug_/i.test(e))).reduce(((e,t)=>{const n=t.substring(6).toLowerCase().replace(/_([a-z])/g,((e,t)=>t.toUpperCase()));let r=process.env[t];return r=!!/^(yes|on|true|enabled)$/i.test(r)||!/^(no|off|false|disabled)$/i.test(r)&&("null"===r?null:Number(r)),e[n]=r,e}),{}),e.exports=V()(t);const{formatters:u}=e.exports;u.o=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts).split("\n").map((e=>e.trim())).join(" ")},u.O=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts)}}(Y,Y.exports)),Y.exports}q=$,"undefined"==typeof process||"renderer"===process.type||!0===process.browser||process.__nwjs?q.exports=(M||(M=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,u=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(u=r))})),t.splice(u,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=V()(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(H,H.exports)),H.exports):q.exports=Q();var ee=function(e){return(e=e||{}).circles?function(e){var t=[],n=[];return e.proto?function e(u){if("object"!=typeof u||null===u)return u;if(u instanceof Date)return new Date(u);if(Array.isArray(u))return r(u,e);if(u instanceof Map)return new Map(r(Array.from(u),e));if(u instanceof Set)return new Set(r(Array.from(u),e));var o={};for(var i in t.push(u),n.push(o),u){var s=u[i];if("object"!=typeof s||null===s)o[i]=s;else if(s instanceof Date)o[i]=new Date(s);else if(s instanceof Map)o[i]=new Map(r(Array.from(s),e));else if(s instanceof Set)o[i]=new Set(r(Array.from(s),e));else if(ArrayBuffer.isView(s))o[i]=te(s);else{var a=t.indexOf(s);o[i]=-1!==a?n[a]:e(s)}}return t.pop(),n.pop(),o}:function e(u){if("object"!=typeof u||null===u)return u;if(u instanceof Date)return new Date(u);if(Array.isArray(u))return r(u,e);if(u instanceof Map)return new Map(r(Array.from(u),e));if(u instanceof Set)return new Set(r(Array.from(u),e));var o={};for(var i in t.push(u),n.push(o),u)if(!1!==Object.hasOwnProperty.call(u,i)){var s=u[i];if("object"!=typeof s||null===s)o[i]=s;else if(s instanceof Date)o[i]=new Date(s);else if(s instanceof Map)o[i]=new Map(r(Array.from(s),e));else if(s instanceof Set)o[i]=new Set(r(Array.from(s),e));else if(ArrayBuffer.isView(s))o[i]=te(s);else{var a=t.indexOf(s);o[i]=-1!==a?n[a]:e(s)}}return t.pop(),n.pop(),o};function r(e,r){for(var u=Object.keys(e),o=new Array(u.length),i=0;i!e,se=e=>e&&"object"==typeof e&&!Array.isArray(e),ae=(e,t,n)=>{(Array.isArray(t)?t:[t]).forEach((t=>{if(t)throw new Error(`Problem with log4js configuration: (${ne.inspect(e,{depth:5})}) - ${n}`)}))};var ce={configure:e=>{re("New configuration to be validated: ",e),ae(e,ie(se(e)),"must be an object."),re(`Calling pre-processing listeners (${ue.length})`),ue.forEach((t=>t(e))),re("Configuration pre-processing finished."),re(`Calling configuration listeners (${oe.length})`),oe.forEach((t=>t(e))),re("Configuration finished.")},addListener:e=>{oe.push(e),re(`Added listener, now ${oe.length} listeners`)},addPreProcessingListener:e=>{ue.push(e),re(`Added pre-processing listener, now ${ue.length} listeners`)},throwExceptionIf:ae,anObject:se,anInteger:e=>e&&"number"==typeof e&&Number.isInteger(e),validIdentifier:e=>/^[A-Za-z][A-Za-z0-9_]*$/g.test(e),not:ie},le={exports:{}};!function(e){function t(e,t){for(var n=e.toString();n.length-1?s:a,l=n(u.getHours()),f=n(u.getMinutes()),D=n(u.getSeconds()),d=t(u.getMilliseconds(),3),p=function(e){var t=Math.abs(e),n=String(Math.floor(t/60)),r=String(t%60);return n=("0"+n).slice(-2),r=("0"+r).slice(-2),0===e?"Z":(e<0?"+":"-")+n+":"+r}(u.getTimezoneOffset());return r.replace(/dd/g,o).replace(/MM/g,i).replace(/y{1,4}/g,c).replace(/hh/g,l).replace(/mm/g,f).replace(/ss/g,D).replace(/SSS/g,d).replace(/O/g,p)}function u(e,t,n,r){e["set"+(r?"":"UTC")+t](n)}e.exports=r,e.exports.asString=r,e.exports.parse=function(t,n,r){if(!t)throw new Error("pattern must be supplied");return function(t,n,r){var o=t.indexOf("O")<0,i=!1,s=[{pattern:/y{1,4}/,regexp:"\\d{1,4}",fn:function(e,t){u(e,"FullYear",t,o)}},{pattern:/MM/,regexp:"\\d{1,2}",fn:function(e,t){u(e,"Month",t-1,o),e.getMonth()!==t-1&&(i=!0)}},{pattern:/dd/,regexp:"\\d{1,2}",fn:function(e,t){i&&u(e,"Month",e.getMonth()-1,o),u(e,"Date",t,o)}},{pattern:/hh/,regexp:"\\d{1,2}",fn:function(e,t){u(e,"Hours",t,o)}},{pattern:/mm/,regexp:"\\d\\d",fn:function(e,t){u(e,"Minutes",t,o)}},{pattern:/ss/,regexp:"\\d\\d",fn:function(e,t){u(e,"Seconds",t,o)}},{pattern:/SSS/,regexp:"\\d\\d\\d",fn:function(e,t){u(e,"Milliseconds",t,o)}},{pattern:/O/,regexp:"[+-]\\d{1,2}:?\\d{2}?|Z",fn:function(e,t){t="Z"===t?0:t.replace(":","");var n=Math.abs(t),r=(t>0?-1:1)*(n%100+60*Math.floor(n/100));e.setUTCMinutes(e.getUTCMinutes()+r)}}],a=s.reduce((function(e,t){return t.pattern.test(e.regexp)?(t.index=e.regexp.match(t.pattern).index,e.regexp=e.regexp.replace(t.pattern,"("+t.regexp+")")):t.index=-1,e}),{regexp:t,index:[]}),c=s.filter((function(e){return e.index>-1}));c.sort((function(e,t){return e.index-t.index}));var l=new RegExp(a.regexp).exec(n);if(l){var f=r||e.exports.now();return c.forEach((function(e,t){e.fn(f,l[t+1])})),f}throw new Error("String '"+n+"' could not be parsed as '"+t+"'")}(t,n,r)},e.exports.now=function(){return new Date},e.exports.ISO8601_FORMAT="yyyy-MM-ddThh:mm:ss.SSS",e.exports.ISO8601_WITH_TZ_OFFSET_FORMAT="yyyy-MM-ddThh:mm:ss.SSSO",e.exports.DATETIME_FORMAT="dd MM yyyy hh:mm:ss.SSS",e.exports.ABSOLUTETIME_FORMAT="hh:mm:ss.SSS"}(le);const fe=le.exports,De=t,de=i,pe=e,Ee=s,he=$.exports("log4js:layouts"),Ce={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[90,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[91,39],yellow:[33,39]};function me(e){return e?`[${Ce[e][0]}m`:""}function Fe(e){return e?`[${Ce[e][1]}m`:""}function ye(e,t){return n=de.format("[%s] [%s] %s - ",fe.asString(e.startTime),e.level.toString(),e.categoryName),me(r=t)+n+Fe(r);var n,r}function ge(e){return ye(e)+de.format(...e.data)}function Ae(e){return ye(e,e.level.colour)+de.format(...e.data)}function ve(e){return de.format(...e.data)}function Se(e){return e.data[0]}function we(e,t){const n=/%(-?[0-9]+)?(\.?-?[0-9]+)?([[\]cdhmnprzxXyflosCMAF%])(\{([^}]+)\})?|([^%]+)/;function r(e){return e&&e.pid?e.pid.toString():process.pid.toString()}e=e||"%r %p %c - %m%n";const u={c:function(e,t){let n=e.categoryName;if(t){const e=parseInt(t,10),r=n.split(".");ee&&(n=r.slice(-e).join(pe.sep))}return n},l:function(e){return e.lineNumber?`${e.lineNumber}`:""},o:function(e){return e.columnNumber?`${e.columnNumber}`:""},s:function(e){return e.callStack||""},C:function(e){return e.className||""},M:function(e){return e.functionName||""},A:function(e){return e.functionAlias||""},F:function(e){return e.callerName||""}};function o(e,t,n){return u[e](t,n)}function i(e,t,n){let r=e;return r=function(e,t){let n;return e?(n=parseInt(e.slice(1),10),n>0?t.slice(0,n):t.slice(n)):t}(t,r),r=function(e,t){let n;if(e)if("-"===e.charAt(0))for(n=parseInt(e.slice(1),10);t.lengthve,basic:()=>ge,colored:()=>Ae,coloured:()=>Ae,pattern:e=>we(e&&e.pattern,e&&e.tokens),dummy:()=>Se};var _e={basicLayout:ge,messagePassThroughLayout:ve,patternLayout:we,colouredLayout:Ae,coloredLayout:Ae,dummyLayout:Se,addLayout(e,t){Oe[e]=t},layout:(e,t)=>Oe[e]&&Oe[e](t)};const be=ce,Be=["white","grey","black","blue","cyan","green","magenta","red","yellow"];class xe{constructor(e,t,n){this.level=e,this.levelStr=t,this.colour=n}toString(){return this.levelStr}static getLevel(e,t){return e?e instanceof xe?e:(e instanceof Object&&e.levelStr&&(e=e.levelStr),xe[e.toString().toUpperCase()]||t):t}static addLevels(e){if(e){Object.keys(e).forEach((t=>{const n=t.toUpperCase();xe[n]=new xe(e[t].value,n,e[t].colour);const r=xe.levels.findIndex((e=>e.levelStr===n));r>-1?xe.levels[r]=xe[n]:xe.levels.push(xe[n])})),xe.levels.sort(((e,t)=>e.level-t.level))}}isLessThanOrEqualTo(e){return"string"==typeof e&&(e=xe.getLevel(e)),this.level<=e.level}isGreaterThanOrEqualTo(e){return"string"==typeof e&&(e=xe.getLevel(e)),this.level>=e.level}isEqualTo(e){return"string"==typeof e&&(e=xe.getLevel(e)),this.level===e.level}}xe.levels=[],xe.addLevels({ALL:{value:Number.MIN_VALUE,colour:"grey"},TRACE:{value:5e3,colour:"blue"},DEBUG:{value:1e4,colour:"cyan"},INFO:{value:2e4,colour:"green"},WARN:{value:3e4,colour:"yellow"},ERROR:{value:4e4,colour:"red"},FATAL:{value:5e4,colour:"magenta"},MARK:{value:9007199254740992,colour:"grey"},OFF:{value:Number.MAX_VALUE,colour:"grey"}}),be.addListener((e=>{const t=e.levels;if(t){be.throwExceptionIf(e,be.not(be.anObject(t)),"levels must be an object");Object.keys(t).forEach((n=>{be.throwExceptionIf(e,be.not(be.validIdentifier(n)),`level name "${n}" is not a valid identifier (must start with a letter, only contain A-Z,a-z,0-9,_)`),be.throwExceptionIf(e,be.not(be.anObject(t[n])),`level "${n}" must be an object`),be.throwExceptionIf(e,be.not(t[n].value),`level "${n}" must have a 'value' property`),be.throwExceptionIf(e,be.not(be.anInteger(t[n].value)),`level "${n}".value must have an integer value`),be.throwExceptionIf(e,be.not(t[n].colour),`level "${n}" must have a 'colour' property`),be.throwExceptionIf(e,be.not(Be.indexOf(t[n].colour)>-1),`level "${n}".colour must be one of ${Be.join(", ")}`)}))}})),be.addListener((e=>{xe.addLevels(e.levels)}));var Pe=xe,Ie={exports:{}},Ne={};/*! (c) 2020 Andrea Giammarchi */ const{parse:Te,stringify:ke}=JSON,{keys:Re}=Object,Me=String,Le="string",je={},$e="object",He=(e,t)=>t,Ge=e=>e instanceof Me?Me(e):e,Ve=(e,t)=>typeof t===Le?new Me(t):t,Je=(e,t,n,r)=>{const u=[];for(let o=Re(n),{length:i}=o,s=0;s{const r=Me(t.push(n)-1);return e.set(n,r),r},We=(e,t)=>{const n=Te(e,Ve).map(Ge),r=n[0],u=t||He,o=typeof r===$e&&r?Je(n,new Set,r,u):r;return u.call({"":o},"",o)};Ne.parse=We;const ze=(e,t,n)=>{const r=t&&typeof t===$e?(e,n)=>""===e||-1Te(ze(e));Ne.fromJSON=e=>We(ke(e));const Ke=Ne,qe=Pe;const Ye=new class{constructor(){const e={__LOG4JS_undefined__:void 0,__LOG4JS_NaN__:Number("abc"),__LOG4JS_Infinity__:1/0,"__LOG4JS_-Infinity__":-1/0};this.deMap=e,this.serMap={},Object.keys(this.deMap).forEach((e=>{const t=this.deMap[e];this.serMap[t]=e}))}canSerialise(e){return"string"!=typeof e&&e in this.serMap}serialise(e){return this.canSerialise(e)?this.serMap[e]:e}canDeserialise(e){return e in this.deMap}deserialise(e){return this.canDeserialise(e)?this.deMap[e]:e}};let Ze=class{constructor(e,t,n,r,u,o){if(this.startTime=new Date,this.categoryName=e,this.data=n,this.level=t,this.context=Object.assign({},r),this.pid=process.pid,this.error=o,void 0!==u){if(!u||"object"!=typeof u||Array.isArray(u))throw new TypeError("Invalid location type passed to LoggingEvent constructor");this.constructor._getLocationKeys().forEach((e=>{void 0!==u[e]&&(this[e]=u[e])}))}}static _getLocationKeys(){return["fileName","lineNumber","columnNumber","callStack","className","functionName","functionAlias","callerName"]}serialise(){return Ke.stringify(this,((e,t)=>(t instanceof Error&&(t=Object.assign({message:t.message,stack:t.stack},t)),Ye.serialise(t))))}static deserialise(e){let t;try{const n=Ke.parse(e,((e,t)=>{if(t&&t.message&&t.stack){const e=new Error(t);Object.keys(t).forEach((n=>{e[n]=t[n]})),t=e}return Ye.deserialise(t)}));this._getLocationKeys().forEach((e=>{void 0!==n[e]&&(n.location||(n.location={}),n.location[e]=n[e])})),t=new Ze(n.categoryName,qe.getLevel(n.level.levelStr),n.data,n.context,n.location,n.error),t.startTime=new Date(n.startTime),t.pid=n.pid,n.cluster&&(t.cluster=n.cluster)}catch(n){t=new Ze("log4js",qe.ERROR,["Unable to parse log:",e,"because: ",n])}return t}};var Xe=Ze;const Qe=$.exports("log4js:clustering"),et=Xe,tt=ce;let nt=!1,rt=null;try{rt=require("cluster")}catch(e){Qe("cluster module not present"),nt=!0}const ut=[];let ot=!1,it="NODE_APP_INSTANCE";const st=()=>ot&&"0"===process.env[it],at=()=>nt||rt&&rt.isMaster||st(),ct=e=>{ut.forEach((t=>t(e)))},lt=(e,t)=>{if(Qe("cluster message received from worker ",e,": ",t),e.topic&&e.data&&(t=e,e=void 0),t&&t.topic&&"log4js:message"===t.topic){Qe("received message: ",t.data);const e=et.deserialise(t.data);ct(e)}};nt||tt.addListener((e=>{ut.length=0,({pm2:ot,disableClustering:nt,pm2InstanceVar:it="NODE_APP_INSTANCE"}=e),Qe(`clustering disabled ? ${nt}`),Qe(`cluster.isMaster ? ${rt&&rt.isMaster}`),Qe(`pm2 enabled ? ${ot}`),Qe(`pm2InstanceVar = ${it}`),Qe(`process.env[${it}] = ${process.env[it]}`),ot&&process.removeListener("message",lt),rt&&rt.removeListener&&rt.removeListener("message",lt),nt||e.disableClustering?Qe("Not listening for cluster messages, because clustering disabled."):st()?(Qe("listening for PM2 broadcast messages"),process.on("message",lt)):rt&&rt.isMaster?(Qe("listening for cluster messages"),rt.on("message",lt)):Qe("not listening for messages, because we are not a master process")}));var ft={onlyOnMaster:(e,t)=>at()?e():t,isMaster:at,send:e=>{at()?ct(e):(ot||(e.cluster={workerId:rt.worker.id,worker:process.pid}),process.send({topic:"log4js:message",data:e.serialise()}))},onMessage:e=>{ut.push(e)}},Dt={};function dt(e){if("number"==typeof e&&Number.isInteger(e))return e;const t={K:1024,M:1048576,G:1073741824},n=Object.keys(t),r=e.slice(-1).toLocaleUpperCase(),u=e.slice(0,-1).trim();if(n.indexOf(r)<0||!Number.isInteger(Number(u)))throw Error(`maxLogSize: "${e}" is invalid`);return u*t[r]}function pt(e){return function(e,t){const n=Object.assign({},t);return Object.keys(e).forEach((r=>{n[r]&&(n[r]=e[r](t[r]))})),n}({maxLogSize:dt},e)}const Et={dateFile:pt,file:pt,fileSync:pt};Dt.modifyConfig=e=>Et[e.type]?Et[e.type](e):e;var ht={};const Ct=console.log.bind(console);ht.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{Ct(e(n,t))}}(n,e.timezoneOffset)};var mt={};mt.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{process.stdout.write(`${e(n,t)}\n`)}}(n,e.timezoneOffset)};var Ft={};Ft.configure=function(e,t){let n=t.colouredLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){return n=>{process.stderr.write(`${e(n,t)}\n`)}}(n,e.timezoneOffset)};var yt={};yt.configure=function(e,t,n,r){const u=n(e.appender);return function(e,t,n,r){const u=r.getLevel(e),o=r.getLevel(t,r.FATAL);return e=>{const t=e.level;u.isLessThanOrEqualTo(t)&&o.isGreaterThanOrEqualTo(t)&&n(e)}}(e.level,e.maxLevel,u,r)};var gt={};const At=$.exports("log4js:categoryFilter");gt.configure=function(e,t,n){const r=n(e.appender);return function(e,t){return"string"==typeof e&&(e=[e]),n=>{At(`Checking ${n.categoryName} against ${e}`),-1===e.indexOf(n.categoryName)&&(At("Not excluded, sending to appender"),t(n))}}(e.exclude,r)};var vt={};const St=$.exports("log4js:noLogFilter");vt.configure=function(e,t,n){const r=n(e.appender);return function(e,t){return n=>{St(`Checking data: ${n.data} against filters: ${e}`),"string"==typeof e&&(e=[e]),e=e.filter((e=>null!=e&&""!==e));const r=new RegExp(e.join("|"),"i");(0===e.length||n.data.findIndex((e=>r.test(e)))<0)&&(St("Not excluded, sending to appender"),t(n))}}(e.exclude,r)};var wt={},Ot={exports:{}},_t={},bt={fromCallback:function(e){return Object.defineProperty((function(){if("function"!=typeof arguments[arguments.length-1])return new Promise(((t,n)=>{arguments[arguments.length]=(e,r)=>{if(e)return n(e);t(r)},arguments.length++,e.apply(this,arguments)}));e.apply(this,arguments)}),"name",{value:e.name})},fromPromise:function(e){return Object.defineProperty((function(){const t=arguments[arguments.length-1];if("function"!=typeof t)return e.apply(this,arguments);e.apply(this,arguments).then((e=>t(null,e)),t)}),"name",{value:e.name})}},Bt=a,xt=process.cwd,Pt=null,It=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){return Pt||(Pt=xt.call(process)),Pt};try{process.cwd()}catch(e){}if("function"==typeof process.chdir){var Nt=process.chdir;process.chdir=function(e){Pt=null,Nt.call(process,e)},Object.setPrototypeOf&&Object.setPrototypeOf(process.chdir,Nt)}var Tt=function(e){Bt.hasOwnProperty("O_SYMLINK")&&process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)&&function(e){e.lchmod=function(t,n,r){e.open(t,Bt.O_WRONLY|Bt.O_SYMLINK,n,(function(t,u){t?r&&r(t):e.fchmod(u,n,(function(t){e.close(u,(function(e){r&&r(t||e)}))}))}))},e.lchmodSync=function(t,n){var r,u=e.openSync(t,Bt.O_WRONLY|Bt.O_SYMLINK,n),o=!0;try{r=e.fchmodSync(u,n),o=!1}finally{if(o)try{e.closeSync(u)}catch(e){}else e.closeSync(u)}return r}}(e);e.lutimes||function(e){Bt.hasOwnProperty("O_SYMLINK")&&e.futimes?(e.lutimes=function(t,n,r,u){e.open(t,Bt.O_SYMLINK,(function(t,o){t?u&&u(t):e.futimes(o,n,r,(function(t){e.close(o,(function(e){u&&u(t||e)}))}))}))},e.lutimesSync=function(t,n,r){var u,o=e.openSync(t,Bt.O_SYMLINK),i=!0;try{u=e.futimesSync(o,n,r),i=!1}finally{if(i)try{e.closeSync(o)}catch(e){}else e.closeSync(o)}return u}):e.futimes&&(e.lutimes=function(e,t,n,r){r&&process.nextTick(r)},e.lutimesSync=function(){})}(e);e.chown=r(e.chown),e.fchown=r(e.fchown),e.lchown=r(e.lchown),e.chmod=t(e.chmod),e.fchmod=t(e.fchmod),e.lchmod=t(e.lchmod),e.chownSync=u(e.chownSync),e.fchownSync=u(e.fchownSync),e.lchownSync=u(e.lchownSync),e.chmodSync=n(e.chmodSync),e.fchmodSync=n(e.fchmodSync),e.lchmodSync=n(e.lchmodSync),e.stat=o(e.stat),e.fstat=o(e.fstat),e.lstat=o(e.lstat),e.statSync=i(e.statSync),e.fstatSync=i(e.fstatSync),e.lstatSync=i(e.lstatSync),e.chmod&&!e.lchmod&&(e.lchmod=function(e,t,n){n&&process.nextTick(n)},e.lchmodSync=function(){});e.chown&&!e.lchown&&(e.lchown=function(e,t,n,r){r&&process.nextTick(r)},e.lchownSync=function(){});"win32"===It&&(e.rename="function"!=typeof e.rename?e.rename:function(t){function n(n,r,u){var o=Date.now(),i=0;t(n,r,(function s(a){if(a&&("EACCES"===a.code||"EPERM"===a.code||"EBUSY"===a.code)&&Date.now()-o<6e4)return setTimeout((function(){e.stat(r,(function(e,o){e&&"ENOENT"===e.code?t(n,r,s):u(a)}))}),i),void(i<100&&(i+=10));u&&u(a)}))}return Object.setPrototypeOf&&Object.setPrototypeOf(n,t),n}(e.rename));function t(t){return t?function(n,r,u){return t.call(e,n,r,(function(e){s(e)&&(e=null),u&&u.apply(this,arguments)}))}:t}function n(t){return t?function(n,r){try{return t.call(e,n,r)}catch(e){if(!s(e))throw e}}:t}function r(t){return t?function(n,r,u,o){return t.call(e,n,r,u,(function(e){s(e)&&(e=null),o&&o.apply(this,arguments)}))}:t}function u(t){return t?function(n,r,u){try{return t.call(e,n,r,u)}catch(e){if(!s(e))throw e}}:t}function o(t){return t?function(n,r,u){function o(e,t){t&&(t.uid<0&&(t.uid+=4294967296),t.gid<0&&(t.gid+=4294967296)),u&&u.apply(this,arguments)}return"function"==typeof r&&(u=r,r=null),r?t.call(e,n,r,o):t.call(e,n,o)}:t}function i(t){return t?function(n,r){var u=r?t.call(e,n,r):t.call(e,n);return u&&(u.uid<0&&(u.uid+=4294967296),u.gid<0&&(u.gid+=4294967296)),u}:t}function s(e){return!e||("ENOSYS"===e.code||!(process.getuid&&0===process.getuid()||"EINVAL"!==e.code&&"EPERM"!==e.code))}e.read="function"!=typeof e.read?e.read:function(t){function n(n,r,u,o,i,s){var a;if(s&&"function"==typeof s){var c=0;a=function(l,f,D){if(l&&"EAGAIN"===l.code&&c<10)return c++,t.call(e,n,r,u,o,i,a);s.apply(this,arguments)}}return t.call(e,n,r,u,o,i,a)}return Object.setPrototypeOf&&Object.setPrototypeOf(n,t),n}(e.read),e.readSync="function"!=typeof e.readSync?e.readSync:(a=e.readSync,function(t,n,r,u,o){for(var i=0;;)try{return a.call(e,t,n,r,u,o)}catch(e){if("EAGAIN"===e.code&&i<10){i++;continue}throw e}});var a};var kt=c.Stream,Rt=function(e){return{ReadStream:function t(n,r){if(!(this instanceof t))return new t(n,r);kt.call(this);var u=this;this.path=n,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=65536,r=r||{};for(var o=Object.keys(r),i=0,s=o.length;ithis.end)throw new Error("start must be <= end");this.pos=this.start}if(null!==this.fd)return void process.nextTick((function(){u._read()}));e.open(this.path,this.flags,this.mode,(function(e,t){if(e)return u.emit("error",e),void(u.readable=!1);u.fd=t,u.emit("open",t),u._read()}))},WriteStream:function t(n,r){if(!(this instanceof t))return new t(n,r);kt.call(this),this.path=n,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0,r=r||{};for(var u=Object.keys(r),o=0,i=u.length;o= zero");this.pos=this.start}this.busy=!1,this._queue=[],null===this.fd&&(this._open=e.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}};var Mt=function(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Object)var t={__proto__:Lt(e)};else t=Object.create(null);return Object.getOwnPropertyNames(e).forEach((function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(e,n))})),t},Lt=Object.getPrototypeOf||function(e){return e.__proto__};var jt,$t,Ht=n,Gt=Tt,Vt=Rt,Jt=Mt,Ut=i;function Wt(e,t){Object.defineProperty(e,jt,{get:function(){return t}})}"function"==typeof Symbol&&"function"==typeof Symbol.for?(jt=Symbol.for("graceful-fs.queue"),$t=Symbol.for("graceful-fs.previous")):(jt="___graceful-fs.queue",$t="___graceful-fs.previous");var zt=function(){};if(Ut.debuglog?zt=Ut.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(zt=function(){var e=Ut.format.apply(Ut,arguments);e="GFS4: "+e.split(/\n/).join("\nGFS4: "),console.error(e)}),!Ht[jt]){var Kt=p[jt]||[];Wt(Ht,Kt),Ht.close=function(e){function t(t,n){return e.call(Ht,t,(function(e){e||Qt(),"function"==typeof n&&n.apply(this,arguments)}))}return Object.defineProperty(t,$t,{value:e}),t}(Ht.close),Ht.closeSync=function(e){function t(t){e.apply(Ht,arguments),Qt()}return Object.defineProperty(t,$t,{value:e}),t}(Ht.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&process.on("exit",(function(){zt(Ht[jt]),l.equal(Ht[jt].length,0)}))}p[jt]||Wt(p,Ht[jt]);var qt,Yt=Zt(Jt(Ht));function Zt(e){Gt(e),e.gracefulify=Zt,e.createReadStream=function(t,n){return new e.ReadStream(t,n)},e.createWriteStream=function(t,n){return new e.WriteStream(t,n)};var t=e.readFile;e.readFile=function(e,n,r){"function"==typeof n&&(r=n,n=null);return function e(n,r,u,o){return t(n,r,(function(t){!t||"EMFILE"!==t.code&&"ENFILE"!==t.code?"function"==typeof u&&u.apply(this,arguments):Xt([e,[n,r,u],t,o||Date.now(),Date.now()])}))}(e,n,r)};var n=e.writeFile;e.writeFile=function(e,t,r,u){"function"==typeof r&&(u=r,r=null);return function e(t,r,u,o,i){return n(t,r,u,(function(n){!n||"EMFILE"!==n.code&&"ENFILE"!==n.code?"function"==typeof o&&o.apply(this,arguments):Xt([e,[t,r,u,o],n,i||Date.now(),Date.now()])}))}(e,t,r,u)};var r=e.appendFile;r&&(e.appendFile=function(e,t,n,u){"function"==typeof n&&(u=n,n=null);return function e(t,n,u,o,i){return r(t,n,u,(function(r){!r||"EMFILE"!==r.code&&"ENFILE"!==r.code?"function"==typeof o&&o.apply(this,arguments):Xt([e,[t,n,u,o],r,i||Date.now(),Date.now()])}))}(e,t,n,u)});var u=e.copyFile;u&&(e.copyFile=function(e,t,n,r){"function"==typeof n&&(r=n,n=0);return function e(t,n,r,o,i){return u(t,n,r,(function(u){!u||"EMFILE"!==u.code&&"ENFILE"!==u.code?"function"==typeof o&&o.apply(this,arguments):Xt([e,[t,n,r,o],u,i||Date.now(),Date.now()])}))}(e,t,n,r)});var o=e.readdir;e.readdir=function(e,t,n){"function"==typeof t&&(n=t,t=null);var r=i.test(process.version)?function(e,t,n,r){return o(e,u(e,t,n,r))}:function(e,t,n,r){return o(e,t,u(e,t,n,r))};return r(e,t,n);function u(e,t,n,u){return function(o,i){!o||"EMFILE"!==o.code&&"ENFILE"!==o.code?(i&&i.sort&&i.sort(),"function"==typeof n&&n.call(this,o,i)):Xt([r,[e,t,n],o,u||Date.now(),Date.now()])}}};var i=/^v[0-5]\./;if("v0.8"===process.version.substr(0,4)){var s=Vt(e);D=s.ReadStream,d=s.WriteStream}var a=e.ReadStream;a&&(D.prototype=Object.create(a.prototype),D.prototype.open=function(){var e=this;E(e.path,e.flags,e.mode,(function(t,n){t?(e.autoClose&&e.destroy(),e.emit("error",t)):(e.fd=n,e.emit("open",n),e.read())}))});var c=e.WriteStream;c&&(d.prototype=Object.create(c.prototype),d.prototype.open=function(){var e=this;E(e.path,e.flags,e.mode,(function(t,n){t?(e.destroy(),e.emit("error",t)):(e.fd=n,e.emit("open",n))}))}),Object.defineProperty(e,"ReadStream",{get:function(){return D},set:function(e){D=e},enumerable:!0,configurable:!0}),Object.defineProperty(e,"WriteStream",{get:function(){return d},set:function(e){d=e},enumerable:!0,configurable:!0});var l=D;Object.defineProperty(e,"FileReadStream",{get:function(){return l},set:function(e){l=e},enumerable:!0,configurable:!0});var f=d;function D(e,t){return this instanceof D?(a.apply(this,arguments),this):D.apply(Object.create(D.prototype),arguments)}function d(e,t){return this instanceof d?(c.apply(this,arguments),this):d.apply(Object.create(d.prototype),arguments)}Object.defineProperty(e,"FileWriteStream",{get:function(){return f},set:function(e){f=e},enumerable:!0,configurable:!0});var p=e.open;function E(e,t,n,r){return"function"==typeof n&&(r=n,n=null),function e(t,n,r,u,o){return p(t,n,r,(function(i,s){!i||"EMFILE"!==i.code&&"ENFILE"!==i.code?"function"==typeof u&&u.apply(this,arguments):Xt([e,[t,n,r,u],i,o||Date.now(),Date.now()])}))}(e,t,n,r)}return e.open=E,e}function Xt(e){zt("ENQUEUE",e[0].name,e[1]),Ht[jt].push(e),en()}function Qt(){for(var e=Date.now(),t=0;t2&&(Ht[jt][t][3]=e,Ht[jt][t][4]=e);en()}function en(){if(clearTimeout(qt),qt=void 0,0!==Ht[jt].length){var e=Ht[jt].shift(),t=e[0],n=e[1],r=e[2],u=e[3],o=e[4];if(void 0===u)zt("RETRY",t.name,n),t.apply(null,n);else if(Date.now()-u>=6e4){zt("TIMEOUT",t.name,n);var i=n.pop();"function"==typeof i&&i.call(null,r)}else{var s=Date.now()-o,a=Math.max(o-u,1);s>=Math.min(1.2*a,100)?(zt("RETRY",t.name,n),t.apply(null,n.concat([u]))):Ht[jt].push(e)}void 0===qt&&(qt=setTimeout(en,0))}}process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!Ht.__patched&&(Yt=Zt(Ht),Ht.__patched=!0),function(e){const t=bt.fromCallback,n=Yt,r=["access","appendFile","chmod","chown","close","copyFile","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchown","lchmod","link","lstat","mkdir","mkdtemp","open","readFile","readdir","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","writeFile"].filter((e=>"function"==typeof n[e]));Object.keys(n).forEach((t=>{"promises"!==t&&(e[t]=n[t])})),r.forEach((r=>{e[r]=t(n[r])})),e.exists=function(e,t){return"function"==typeof t?n.exists(e,t):new Promise((t=>n.exists(e,t)))},e.read=function(e,t,r,u,o,i){return"function"==typeof i?n.read(e,t,r,u,o,i):new Promise(((i,s)=>{n.read(e,t,r,u,o,((e,t,n)=>{if(e)return s(e);i({bytesRead:t,buffer:n})}))}))},e.write=function(e,t,...r){return"function"==typeof r[r.length-1]?n.write(e,t,...r):new Promise(((u,o)=>{n.write(e,t,...r,((e,t,n)=>{if(e)return o(e);u({bytesWritten:t,buffer:n})}))}))},"function"==typeof n.realpath.native&&(e.realpath.native=t(n.realpath.native))}(_t);const tn=e;function nn(e){return(e=tn.normalize(tn.resolve(e)).split(tn.sep)).length>0?e[0]:null}const rn=/[<>:"|?*]/;var un=function(e){const t=nn(e);return e=e.replace(t,""),rn.test(e)};const on=Yt,sn=e,an=un,cn=parseInt("0777",8);var ln=function e(t,n,r,u){if("function"==typeof n?(r=n,n={}):n&&"object"==typeof n||(n={mode:n}),"win32"===process.platform&&an(t)){const e=new Error(t+" contains invalid WIN32 path characters.");return e.code="EINVAL",r(e)}let o=n.mode;const i=n.fs||on;void 0===o&&(o=cn&~process.umask()),u||(u=null),r=r||function(){},t=sn.resolve(t),i.mkdir(t,o,(o=>{if(!o)return r(null,u=u||t);if("ENOENT"===o.code){if(sn.dirname(t)===t)return r(o);e(sn.dirname(t),n,((u,o)=>{u?r(u,o):e(t,n,r,o)}))}else i.stat(t,((e,t)=>{e||!t.isDirectory()?r(o,u):r(null,u)}))}))};const fn=Yt,Dn=e,dn=un,pn=parseInt("0777",8);var En=function e(t,n,r){n&&"object"==typeof n||(n={mode:n});let u=n.mode;const o=n.fs||fn;if("win32"===process.platform&&dn(t)){const e=new Error(t+" contains invalid WIN32 path characters.");throw e.code="EINVAL",e}void 0===u&&(u=pn&~process.umask()),r||(r=null),t=Dn.resolve(t);try{o.mkdirSync(t,u),r=r||t}catch(u){if("ENOENT"===u.code){if(Dn.dirname(t)===t)throw u;r=e(Dn.dirname(t),n,r),e(t,n,r)}else{let e;try{e=o.statSync(t)}catch(e){throw u}if(!e.isDirectory())throw u}}return r};const hn=(0,bt.fromCallback)(ln);var Cn={mkdirs:hn,mkdirsSync:En,mkdirp:hn,mkdirpSync:En,ensureDir:hn,ensureDirSync:En};const mn=Yt;var Fn=function(e,t,n,r){mn.open(e,"r+",((e,u)=>{if(e)return r(e);mn.futimes(u,t,n,(e=>{mn.close(u,(t=>{r&&r(e||t)}))}))}))},yn=function(e,t,n){const r=mn.openSync(e,"r+");return mn.futimesSync(r,t,n),mn.closeSync(r)};const gn=Yt,An=e,vn=10,Sn=5,wn=0,On=process.versions.node.split("."),_n=Number.parseInt(On[0],10),bn=Number.parseInt(On[1],10),Bn=Number.parseInt(On[2],10);function xn(){if(_n>vn)return!0;if(_n===vn){if(bn>Sn)return!0;if(bn===Sn&&Bn>=wn)return!0}return!1}function Pn(e,t){const n=An.resolve(e).split(An.sep).filter((e=>e)),r=An.resolve(t).split(An.sep).filter((e=>e));return n.reduce(((e,t,n)=>e&&r[n]===t),!0)}function In(e,t,n){return`Cannot ${n} '${e}' to a subdirectory of itself, '${t}'.`}var Nn,Tn,kn={checkPaths:function(e,t,n,r){!function(e,t,n){xn()?gn.stat(e,{bigint:!0},((e,r)=>{if(e)return n(e);gn.stat(t,{bigint:!0},((e,t)=>e?"ENOENT"===e.code?n(null,{srcStat:r,destStat:null}):n(e):n(null,{srcStat:r,destStat:t})))})):gn.stat(e,((e,r)=>{if(e)return n(e);gn.stat(t,((e,t)=>e?"ENOENT"===e.code?n(null,{srcStat:r,destStat:null}):n(e):n(null,{srcStat:r,destStat:t})))}))}(e,t,((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;return s&&s.ino&&s.dev&&s.ino===i.ino&&s.dev===i.dev?r(new Error("Source and destination must not be the same.")):i.isDirectory()&&Pn(e,t)?r(new Error(In(e,t,n))):r(null,{srcStat:i,destStat:s})}))},checkPathsSync:function(e,t,n){const{srcStat:r,destStat:u}=function(e,t){let n,r;n=xn()?gn.statSync(e,{bigint:!0}):gn.statSync(e);try{r=xn()?gn.statSync(t,{bigint:!0}):gn.statSync(t)}catch(e){if("ENOENT"===e.code)return{srcStat:n,destStat:null};throw e}return{srcStat:n,destStat:r}}(e,t);if(u&&u.ino&&u.dev&&u.ino===r.ino&&u.dev===r.dev)throw new Error("Source and destination must not be the same.");if(r.isDirectory()&&Pn(e,t))throw new Error(In(e,t,n));return{srcStat:r,destStat:u}},checkParentPaths:function e(t,n,r,u,o){const i=An.resolve(An.dirname(t)),s=An.resolve(An.dirname(r));if(s===i||s===An.parse(s).root)return o();xn()?gn.stat(s,{bigint:!0},((i,a)=>i?"ENOENT"===i.code?o():o(i):a.ino&&a.dev&&a.ino===n.ino&&a.dev===n.dev?o(new Error(In(t,r,u))):e(t,n,s,u,o))):gn.stat(s,((i,a)=>i?"ENOENT"===i.code?o():o(i):a.ino&&a.dev&&a.ino===n.ino&&a.dev===n.dev?o(new Error(In(t,r,u))):e(t,n,s,u,o)))},checkParentPathsSync:function e(t,n,r,u){const o=An.resolve(An.dirname(t)),i=An.resolve(An.dirname(r));if(i===o||i===An.parse(i).root)return;let s;try{s=xn()?gn.statSync(i,{bigint:!0}):gn.statSync(i)}catch(e){if("ENOENT"===e.code)return;throw e}if(s.ino&&s.dev&&s.ino===n.ino&&s.dev===n.dev)throw new Error(In(t,r,u));return e(t,n,i,u)},isSrcSubdir:Pn};const Rn=Yt,Mn=e,Ln=Cn.mkdirsSync,jn=yn,$n=kn;function Hn(e,t,n,r){if(!r.filter||r.filter(t,n))return function(e,t,n,r){const u=r.dereference?Rn.statSync:Rn.lstatSync,o=u(t);if(o.isDirectory())return function(e,t,n,r,u){if(!t)return function(e,t,n,r){return Rn.mkdirSync(n),Vn(t,n,r),Rn.chmodSync(n,e.mode)}(e,n,r,u);if(t&&!t.isDirectory())throw new Error(`Cannot overwrite non-directory '${r}' with directory '${n}'.`);return Vn(n,r,u)}(o,e,t,n,r);if(o.isFile()||o.isCharacterDevice()||o.isBlockDevice())return function(e,t,n,r,u){return t?function(e,t,n,r){if(r.overwrite)return Rn.unlinkSync(n),Gn(e,t,n,r);if(r.errorOnExist)throw new Error(`'${n}' already exists`)}(e,n,r,u):Gn(e,n,r,u)}(o,e,t,n,r);if(o.isSymbolicLink())return function(e,t,n,r){let u=Rn.readlinkSync(t);r.dereference&&(u=Mn.resolve(process.cwd(),u));if(e){let e;try{e=Rn.readlinkSync(n)}catch(e){if("EINVAL"===e.code||"UNKNOWN"===e.code)return Rn.symlinkSync(u,n);throw e}if(r.dereference&&(e=Mn.resolve(process.cwd(),e)),$n.isSrcSubdir(u,e))throw new Error(`Cannot copy '${u}' to a subdirectory of itself, '${e}'.`);if(Rn.statSync(n).isDirectory()&&$n.isSrcSubdir(e,u))throw new Error(`Cannot overwrite '${e}' with '${u}'.`);return function(e,t){return Rn.unlinkSync(t),Rn.symlinkSync(e,t)}(u,n)}return Rn.symlinkSync(u,n)}(e,t,n,r)}(e,t,n,r)}function Gn(e,t,n,r){return"function"==typeof Rn.copyFileSync?(Rn.copyFileSync(t,n),Rn.chmodSync(n,e.mode),r.preserveTimestamps?jn(n,e.atime,e.mtime):void 0):function(e,t,n,r){const u=65536,o=(Tn?Nn:(Tn=1,Nn=function(e){if("function"==typeof Buffer.allocUnsafe)try{return Buffer.allocUnsafe(e)}catch(t){return new Buffer(e)}return new Buffer(e)}))(u),i=Rn.openSync(t,"r"),s=Rn.openSync(n,"w",e.mode);let a=0;for(;afunction(e,t,n,r){const u=Mn.join(t,e),o=Mn.join(n,e),{destStat:i}=$n.checkPathsSync(u,o,"copy");return Hn(i,u,o,r)}(r,e,t,n)))}var Jn=function(e,t,n){"function"==typeof n&&(n={filter:n}),(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269");const{srcStat:r,destStat:u}=$n.checkPathsSync(e,t,"copy");return $n.checkParentPathsSync(e,r,t,"copy"),function(e,t,n,r){if(r.filter&&!r.filter(t,n))return;const u=Mn.dirname(n);Rn.existsSync(u)||Ln(u);return Hn(e,t,n,r)}(u,e,t,n)},Un={copySync:Jn};const Wn=bt.fromPromise,zn=_t;var Kn={pathExists:Wn((function(e){return zn.access(e).then((()=>!0)).catch((()=>!1))})),pathExistsSync:zn.existsSync};const qn=Yt,Yn=e,Zn=Cn.mkdirs,Xn=Kn.pathExists,Qn=Fn,er=kn;function tr(e,t,n,r,u){const o=Yn.dirname(n);Xn(o,((i,s)=>i?u(i):s?rr(e,t,n,r,u):void Zn(o,(o=>o?u(o):rr(e,t,n,r,u)))))}function nr(e,t,n,r,u,o){Promise.resolve(u.filter(n,r)).then((i=>i?e(t,n,r,u,o):o()),(e=>o(e)))}function rr(e,t,n,r,u){return r.filter?nr(ur,e,t,n,r,u):ur(e,t,n,r,u)}function ur(e,t,n,r,u){(r.dereference?qn.stat:qn.lstat)(t,((o,i)=>o?u(o):i.isDirectory()?function(e,t,n,r,u,o){if(!t)return function(e,t,n,r,u){qn.mkdir(n,(o=>{if(o)return u(o);sr(t,n,r,(t=>t?u(t):qn.chmod(n,e.mode,u)))}))}(e,n,r,u,o);if(t&&!t.isDirectory())return o(new Error(`Cannot overwrite non-directory '${r}' with directory '${n}'.`));return sr(n,r,u,o)}(i,e,t,n,r,u):i.isFile()||i.isCharacterDevice()||i.isBlockDevice()?function(e,t,n,r,u,o){return t?function(e,t,n,r,u){if(!r.overwrite)return r.errorOnExist?u(new Error(`'${n}' already exists`)):u();qn.unlink(n,(o=>o?u(o):or(e,t,n,r,u)))}(e,n,r,u,o):or(e,n,r,u,o)}(i,e,t,n,r,u):i.isSymbolicLink()?function(e,t,n,r,u){qn.readlink(t,((t,o)=>t?u(t):(r.dereference&&(o=Yn.resolve(process.cwd(),o)),e?void qn.readlink(n,((t,i)=>t?"EINVAL"===t.code||"UNKNOWN"===t.code?qn.symlink(o,n,u):u(t):(r.dereference&&(i=Yn.resolve(process.cwd(),i)),er.isSrcSubdir(o,i)?u(new Error(`Cannot copy '${o}' to a subdirectory of itself, '${i}'.`)):e.isDirectory()&&er.isSrcSubdir(i,o)?u(new Error(`Cannot overwrite '${i}' with '${o}'.`)):function(e,t,n){qn.unlink(t,(r=>r?n(r):qn.symlink(e,t,n)))}(o,n,u)))):qn.symlink(o,n,u))))}(e,t,n,r,u):void 0))}function or(e,t,n,r,u){return"function"==typeof qn.copyFile?qn.copyFile(t,n,(t=>t?u(t):ir(e,n,r,u))):function(e,t,n,r,u){const o=qn.createReadStream(t);o.on("error",(e=>u(e))).once("open",(()=>{const t=qn.createWriteStream(n,{mode:e.mode});t.on("error",(e=>u(e))).on("open",(()=>o.pipe(t))).once("close",(()=>ir(e,n,r,u)))}))}(e,t,n,r,u)}function ir(e,t,n,r){qn.chmod(t,e.mode,(u=>u?r(u):n.preserveTimestamps?Qn(t,e.atime,e.mtime,r):r()))}function sr(e,t,n,r){qn.readdir(e,((u,o)=>u?r(u):ar(o,e,t,n,r)))}function ar(e,t,n,r,u){const o=e.pop();return o?function(e,t,n,r,u,o){const i=Yn.join(n,t),s=Yn.join(r,t);er.checkPaths(i,s,"copy",((t,a)=>{if(t)return o(t);const{destStat:c}=a;rr(c,i,s,u,(t=>t?o(t):ar(e,n,r,u,o)))}))}(e,o,t,n,r,u):u()}var cr=function(e,t,n,r){"function"!=typeof n||r?"function"==typeof n&&(n={filter:n}):(r=n,n={}),r=r||function(){},(n=n||{}).clobber=!("clobber"in n)||!!n.clobber,n.overwrite="overwrite"in n?!!n.overwrite:n.clobber,n.preserveTimestamps&&"ia32"===process.arch&&console.warn("fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n\n see https://github.com/jprichardson/node-fs-extra/issues/269"),er.checkPaths(e,t,"copy",((u,o)=>{if(u)return r(u);const{srcStat:i,destStat:s}=o;er.checkParentPaths(e,i,t,"copy",(u=>u?r(u):n.filter?nr(tr,s,e,t,n,r):tr(s,e,t,n,r)))}))};var lr={copy:(0,bt.fromCallback)(cr)};const fr=Yt,Dr=e,dr=l,pr="win32"===process.platform;function Er(e){["unlink","chmod","stat","lstat","rmdir","readdir"].forEach((t=>{e[t]=e[t]||fr[t],e[t+="Sync"]=e[t]||fr[t]})),e.maxBusyTries=e.maxBusyTries||3}function hr(e,t,n){let r=0;"function"==typeof t&&(n=t,t={}),dr(e,"rimraf: missing path"),dr.strictEqual(typeof e,"string","rimraf: path should be a string"),dr.strictEqual(typeof n,"function","rimraf: callback function required"),dr(t,"rimraf: invalid options argument provided"),dr.strictEqual(typeof t,"object","rimraf: options should be object"),Er(t),Cr(e,t,(function u(o){if(o){if(("EBUSY"===o.code||"ENOTEMPTY"===o.code||"EPERM"===o.code)&&rCr(e,t,u)),100*r)}"ENOENT"===o.code&&(o=null)}n(o)}))}function Cr(e,t,n){dr(e),dr(t),dr("function"==typeof n),t.lstat(e,((r,u)=>r&&"ENOENT"===r.code?n(null):r&&"EPERM"===r.code&&pr?mr(e,t,r,n):u&&u.isDirectory()?yr(e,t,r,n):void t.unlink(e,(r=>{if(r){if("ENOENT"===r.code)return n(null);if("EPERM"===r.code)return pr?mr(e,t,r,n):yr(e,t,r,n);if("EISDIR"===r.code)return yr(e,t,r,n)}return n(r)}))))}function mr(e,t,n,r){dr(e),dr(t),dr("function"==typeof r),n&&dr(n instanceof Error),t.chmod(e,438,(u=>{u?r("ENOENT"===u.code?null:n):t.stat(e,((u,o)=>{u?r("ENOENT"===u.code?null:n):o.isDirectory()?yr(e,t,n,r):t.unlink(e,r)}))}))}function Fr(e,t,n){let r;dr(e),dr(t),n&&dr(n instanceof Error);try{t.chmodSync(e,438)}catch(e){if("ENOENT"===e.code)return;throw n}try{r=t.statSync(e)}catch(e){if("ENOENT"===e.code)return;throw n}r.isDirectory()?Ar(e,t,n):t.unlinkSync(e)}function yr(e,t,n,r){dr(e),dr(t),n&&dr(n instanceof Error),dr("function"==typeof r),t.rmdir(e,(u=>{!u||"ENOTEMPTY"!==u.code&&"EEXIST"!==u.code&&"EPERM"!==u.code?u&&"ENOTDIR"===u.code?r(n):r(u):function(e,t,n){dr(e),dr(t),dr("function"==typeof n),t.readdir(e,((r,u)=>{if(r)return n(r);let o,i=u.length;if(0===i)return t.rmdir(e,n);u.forEach((r=>{hr(Dr.join(e,r),t,(r=>{if(!o)return r?n(o=r):void(0==--i&&t.rmdir(e,n))}))}))}))}(e,t,r)}))}function gr(e,t){let n;Er(t=t||{}),dr(e,"rimraf: missing path"),dr.strictEqual(typeof e,"string","rimraf: path should be a string"),dr(t,"rimraf: missing options"),dr.strictEqual(typeof t,"object","rimraf: options should be object");try{n=t.lstatSync(e)}catch(n){if("ENOENT"===n.code)return;"EPERM"===n.code&&pr&&Fr(e,t,n)}try{n&&n.isDirectory()?Ar(e,t,null):t.unlinkSync(e)}catch(n){if("ENOENT"===n.code)return;if("EPERM"===n.code)return pr?Fr(e,t,n):Ar(e,t,n);if("EISDIR"!==n.code)throw n;Ar(e,t,n)}}function Ar(e,t,n){dr(e),dr(t),n&&dr(n instanceof Error);try{t.rmdirSync(e)}catch(r){if("ENOTDIR"===r.code)throw n;if("ENOTEMPTY"===r.code||"EEXIST"===r.code||"EPERM"===r.code)!function(e,t){if(dr(e),dr(t),t.readdirSync(e).forEach((n=>gr(Dr.join(e,n),t))),!pr){return t.rmdirSync(e,t)}{const n=Date.now();do{try{return t.rmdirSync(e,t)}catch(e){}}while(Date.now()-n<500)}}(e,t);else if("ENOENT"!==r.code)throw r}}var vr=hr;hr.sync=gr;const Sr=vr;var wr={remove:(0,bt.fromCallback)(Sr),removeSync:Sr.sync};const Or=bt.fromCallback,_r=Yt,br=e,Br=Cn,xr=wr,Pr=Or((function(e,t){t=t||function(){},_r.readdir(e,((n,r)=>{if(n)return Br.mkdirs(e,t);r=r.map((t=>br.join(e,t))),function e(){const n=r.pop();if(!n)return t();xr.remove(n,(n=>{if(n)return t(n);e()}))}()}))}));function Ir(e){let t;try{t=_r.readdirSync(e)}catch(t){return Br.mkdirsSync(e)}t.forEach((t=>{t=br.join(e,t),xr.removeSync(t)}))}var Nr={emptyDirSync:Ir,emptydirSync:Ir,emptyDir:Pr,emptydir:Pr};const Tr=bt.fromCallback,kr=e,Rr=Yt,Mr=Cn,Lr=Kn.pathExists;var jr={createFile:Tr((function(e,t){function n(){Rr.writeFile(e,"",(e=>{if(e)return t(e);t()}))}Rr.stat(e,((r,u)=>{if(!r&&u.isFile())return t();const o=kr.dirname(e);Lr(o,((e,r)=>e?t(e):r?n():void Mr.mkdirs(o,(e=>{if(e)return t(e);n()}))))}))})),createFileSync:function(e){let t;try{t=Rr.statSync(e)}catch(e){}if(t&&t.isFile())return;const n=kr.dirname(e);Rr.existsSync(n)||Mr.mkdirsSync(n),Rr.writeFileSync(e,"")}};const $r=bt.fromCallback,Hr=e,Gr=Yt,Vr=Cn,Jr=Kn.pathExists;var Ur={createLink:$r((function(e,t,n){function r(e,t){Gr.link(e,t,(e=>{if(e)return n(e);n(null)}))}Jr(t,((u,o)=>u?n(u):o?n(null):void Gr.lstat(e,(u=>{if(u)return u.message=u.message.replace("lstat","ensureLink"),n(u);const o=Hr.dirname(t);Jr(o,((u,i)=>u?n(u):i?r(e,t):void Vr.mkdirs(o,(u=>{if(u)return n(u);r(e,t)}))))}))))})),createLinkSync:function(e,t){if(Gr.existsSync(t))return;try{Gr.lstatSync(e)}catch(e){throw e.message=e.message.replace("lstat","ensureLink"),e}const n=Hr.dirname(t);return Gr.existsSync(n)||Vr.mkdirsSync(n),Gr.linkSync(e,t)}};const Wr=e,zr=Yt,Kr=Kn.pathExists;var qr={symlinkPaths:function(e,t,n){if(Wr.isAbsolute(e))return zr.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:e})));{const r=Wr.dirname(t),u=Wr.join(r,e);return Kr(u,((t,o)=>t?n(t):o?n(null,{toCwd:u,toDst:e}):zr.lstat(e,(t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),n(t)):n(null,{toCwd:e,toDst:Wr.relative(r,e)})))))}},symlinkPathsSync:function(e,t){let n;if(Wr.isAbsolute(e)){if(n=zr.existsSync(e),!n)throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}{const r=Wr.dirname(t),u=Wr.join(r,e);if(n=zr.existsSync(u),n)return{toCwd:u,toDst:e};if(n=zr.existsSync(e),!n)throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:Wr.relative(r,e)}}}};const Yr=Yt;var Zr={symlinkType:function(e,t,n){if(n="function"==typeof t?t:n,t="function"!=typeof t&&t)return n(null,t);Yr.lstat(e,((e,r)=>{if(e)return n(null,"file");t=r&&r.isDirectory()?"dir":"file",n(null,t)}))},symlinkTypeSync:function(e,t){let n;if(t)return t;try{n=Yr.lstatSync(e)}catch(e){return"file"}return n&&n.isDirectory()?"dir":"file"}};const Xr=bt.fromCallback,Qr=e,eu=Yt,tu=Cn.mkdirs,nu=Cn.mkdirsSync,ru=qr.symlinkPaths,uu=qr.symlinkPathsSync,ou=Zr.symlinkType,iu=Zr.symlinkTypeSync,su=Kn.pathExists;var au={createSymlink:Xr((function(e,t,n,r){r="function"==typeof n?n:r,n="function"!=typeof n&&n,su(t,((u,o)=>u?r(u):o?r(null):void ru(e,t,((u,o)=>{if(u)return r(u);e=o.toDst,ou(o.toCwd,n,((n,u)=>{if(n)return r(n);const o=Qr.dirname(t);su(o,((n,i)=>n?r(n):i?eu.symlink(e,t,u,r):void tu(o,(n=>{if(n)return r(n);eu.symlink(e,t,u,r)}))))}))}))))})),createSymlinkSync:function(e,t,n){if(eu.existsSync(t))return;const r=uu(e,t);e=r.toDst,n=iu(r.toCwd,n);const u=Qr.dirname(t);return eu.existsSync(u)||nu(u),eu.symlinkSync(e,t,n)}};var cu,lu={createFile:jr.createFile,createFileSync:jr.createFileSync,ensureFile:jr.createFile,ensureFileSync:jr.createFileSync,createLink:Ur.createLink,createLinkSync:Ur.createLinkSync,ensureLink:Ur.createLink,ensureLinkSync:Ur.createLinkSync,createSymlink:au.createSymlink,createSymlinkSync:au.createSymlinkSync,ensureSymlink:au.createSymlink,ensureSymlinkSync:au.createSymlinkSync};try{cu=Yt}catch(e){cu=n}function fu(e,t){var n,r="\n";return"object"==typeof t&&null!==t&&(t.spaces&&(n=t.spaces),t.EOL&&(r=t.EOL)),JSON.stringify(e,t?t.replacer:null,n).replace(/\n/g,r)+r}function Du(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e=e.replace(/^\uFEFF/,"")}var du={readFile:function(e,t,n){null==n&&(n=t,t={}),"string"==typeof t&&(t={encoding:t});var r=(t=t||{}).fs||cu,u=!0;"throws"in t&&(u=t.throws),r.readFile(e,t,(function(r,o){if(r)return n(r);var i;o=Du(o);try{i=JSON.parse(o,t?t.reviver:null)}catch(t){return u?(t.message=e+": "+t.message,n(t)):n(null,null)}n(null,i)}))},readFileSync:function(e,t){"string"==typeof(t=t||{})&&(t={encoding:t});var n=t.fs||cu,r=!0;"throws"in t&&(r=t.throws);try{var u=n.readFileSync(e,t);return u=Du(u),JSON.parse(u,t.reviver)}catch(t){if(r)throw t.message=e+": "+t.message,t;return null}},writeFile:function(e,t,n,r){null==r&&(r=n,n={});var u=(n=n||{}).fs||cu,o="";try{o=fu(t,n)}catch(e){return void(r&&r(e,null))}u.writeFile(e,o,n,r)},writeFileSync:function(e,t,n){var r=(n=n||{}).fs||cu,u=fu(t,n);return r.writeFileSync(e,u,n)}},pu=du;const Eu=bt.fromCallback,hu=pu;var Cu={readJson:Eu(hu.readFile),readJsonSync:hu.readFileSync,writeJson:Eu(hu.writeFile),writeJsonSync:hu.writeFileSync};const mu=e,Fu=Cn,yu=Kn.pathExists,gu=Cu;var Au=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=mu.dirname(e);yu(u,((o,i)=>o?r(o):i?gu.writeJson(e,t,n,r):void Fu.mkdirs(u,(u=>{if(u)return r(u);gu.writeJson(e,t,n,r)}))))};const vu=Yt,Su=e,wu=Cn,Ou=Cu;var _u=function(e,t,n){const r=Su.dirname(e);vu.existsSync(r)||wu.mkdirsSync(r),Ou.writeJsonSync(e,t,n)};const bu=bt.fromCallback,Bu=Cu;Bu.outputJson=bu(Au),Bu.outputJsonSync=_u,Bu.outputJSON=Bu.outputJson,Bu.outputJSONSync=Bu.outputJsonSync,Bu.writeJSON=Bu.writeJson,Bu.writeJSONSync=Bu.writeJsonSync,Bu.readJSON=Bu.readJson,Bu.readJSONSync=Bu.readJsonSync;var xu=Bu;const Pu=Yt,Iu=e,Nu=Un.copySync,Tu=wr.removeSync,ku=Cn.mkdirpSync,Ru=kn;function Mu(e,t,n){try{Pu.renameSync(e,t)}catch(r){if("EXDEV"!==r.code)throw r;return function(e,t,n){const r={overwrite:n,errorOnExist:!0};return Nu(e,t,r),Tu(e)}(e,t,n)}}var Lu=function(e,t,n){const r=(n=n||{}).overwrite||n.clobber||!1,{srcStat:u}=Ru.checkPathsSync(e,t,"move");return Ru.checkParentPathsSync(e,u,t,"move"),ku(Iu.dirname(t)),function(e,t,n){if(n)return Tu(t),Mu(e,t,n);if(Pu.existsSync(t))throw new Error("dest already exists.");return Mu(e,t,n)}(e,t,r)},ju={moveSync:Lu};const $u=Yt,Hu=e,Gu=lr.copy,Vu=wr.remove,Ju=Cn.mkdirp,Uu=Kn.pathExists,Wu=kn;function zu(e,t,n,r){$u.rename(e,t,(u=>u?"EXDEV"!==u.code?r(u):function(e,t,n,r){const u={overwrite:n,errorOnExist:!0};Gu(e,t,u,(t=>t?r(t):Vu(e,r)))}(e,t,n,r):r()))}var Ku=function(e,t,n,r){"function"==typeof n&&(r=n,n={});const u=n.overwrite||n.clobber||!1;Wu.checkPaths(e,t,"move",((n,o)=>{if(n)return r(n);const{srcStat:i}=o;Wu.checkParentPaths(e,i,t,"move",(n=>{if(n)return r(n);Ju(Hu.dirname(t),(n=>n?r(n):function(e,t,n,r){if(n)return Vu(t,(u=>u?r(u):zu(e,t,n,r)));Uu(t,((u,o)=>u?r(u):o?r(new Error("dest already exists.")):zu(e,t,n,r)))}(e,t,u,r)))}))}))};var qu={move:(0,bt.fromCallback)(Ku)};const Yu=bt.fromCallback,Zu=Yt,Xu=e,Qu=Cn,eo=Kn.pathExists;var to={outputFile:Yu((function(e,t,n,r){"function"==typeof n&&(r=n,n="utf8");const u=Xu.dirname(e);eo(u,((o,i)=>o?r(o):i?Zu.writeFile(e,t,n,r):void Qu.mkdirs(u,(u=>{if(u)return r(u);Zu.writeFile(e,t,n,r)}))))})),outputFileSync:function(e,...t){const n=Xu.dirname(e);if(Zu.existsSync(n))return Zu.writeFileSync(e,...t);Qu.mkdirsSync(n),Zu.writeFileSync(e,...t)}};!function(e){e.exports=Object.assign({},_t,Un,lr,Nr,lu,xu,Cn,ju,qu,to,Kn,wr);const t=n;Object.getOwnPropertyDescriptor(t,"promises")&&Object.defineProperty(e.exports,"promises",{get:()=>t.promises})}(Ot);const no=$.exports("streamroller:fileNameFormatter"),ro=e;const uo=$.exports("streamroller:fileNameParser"),oo=le.exports;const io=$.exports("streamroller:moveAndMaybeCompressFile"),so=Ot.exports,ao=f;var co=async(e,t,n)=>{if(n=function(e){const t={mode:parseInt("0600",8),compress:!1},n=Object.assign({},t,e);return io(`_parseOption: moveAndMaybeCompressFile called with option=${JSON.stringify(n)}`),n}(n),e!==t){if(await so.pathExists(e))if(io(`moveAndMaybeCompressFile: moving file from ${e} to ${t} ${n.compress?"with":"without"} compress`),n.compress)await new Promise(((r,u)=>{let o=!1;const i=so.createWriteStream(t,{mode:n.mode,flags:"wx"}).on("open",(()=>{o=!0;const t=so.createReadStream(e).on("open",(()=>{t.pipe(ao.createGzip()).pipe(i)})).on("error",(t=>{io(`moveAndMaybeCompressFile: error reading ${e}`,t),i.destroy(t)}))})).on("finish",(()=>{io(`moveAndMaybeCompressFile: finished compressing ${t}, deleting ${e}`),so.unlink(e).then(r).catch((t=>{io(`moveAndMaybeCompressFile: error deleting ${e}, truncating instead`,t),so.truncate(e).then(r).catch((t=>{io(`moveAndMaybeCompressFile: error truncating ${e}`,t),u(t)}))}))})).on("error",(e=>{o?(io(`moveAndMaybeCompressFile: error writing ${t}, deleting`,e),so.unlink(t).then((()=>{u(e)})).catch((e=>{io(`moveAndMaybeCompressFile: error deleting ${t}`,e),u(e)}))):(io(`moveAndMaybeCompressFile: error creating ${t}`,e),u(e))}))})).catch((()=>{}));else{io(`moveAndMaybeCompressFile: renaming ${e} to ${t}`);try{await so.move(e,t,{overwrite:!0})}catch(n){if(io(`moveAndMaybeCompressFile: error renaming ${e} to ${t}`,n),"ENOENT"!==n.code){io("moveAndMaybeCompressFile: trying copy+truncate instead");try{await so.copy(e,t,{overwrite:!0}),await so.truncate(e)}catch(e){io("moveAndMaybeCompressFile: error copy+truncate",e)}}}}}else io("moveAndMaybeCompressFile: source and target are the same, not doing anything")};const lo=$.exports("streamroller:RollingFileWriteStream"),fo=Ot.exports,Do=e,po=t,Eo=()=>new Date,ho=le.exports,{Writable:Co}=c,mo=({file:e,keepFileExt:t,needsIndex:n,alwaysIncludeDate:r,compress:u,fileNameSep:o})=>{let i=o||".";const s=ro.join(e.dir,e.name),a=t=>t+e.ext,c=(e,t,r)=>!n&&r||!t?e:e+i+t,l=(e,t,n)=>(t>0||r)&&n?e+i+n:e,f=(e,t)=>t&&u?e+".gz":e,D=t?[l,c,a,f]:[a,l,c,f];return({date:e,index:t})=>(no(`_formatFileName: date=${e}, index=${t}`),D.reduce(((n,r)=>r(n,t,e)),s))},Fo=({file:e,keepFileExt:t,pattern:n,fileNameSep:r})=>{let u=r||".";const o="__NOT_MATCHING__";let i=[(e,t)=>e.endsWith(".gz")?(uo("it is gzipped"),t.isCompressed=!0,e.slice(0,-3)):e,t?t=>t.startsWith(e.name)&&t.endsWith(e.ext)?(uo("it starts and ends with the right things"),t.slice(e.name.length+1,-1*e.ext.length)):o:t=>t.startsWith(e.base)?(uo("it starts with the right things"),t.slice(e.base.length+1)):o,n?(e,t)=>{const r=e.split(u);let o=r[r.length-1];uo("items: ",r,", indexStr: ",o);let i=e;void 0!==o&&o.match(/^\d+$/)?(i=e.slice(0,-1*(o.length+1)),uo(`dateStr is ${i}`),n&&!i&&(i=o,o="0")):o="0";try{const r=oo.parse(n,i,new Date(0,0));return oo.asString(n,r)!==i?e:(t.index=parseInt(o,10),t.date=i,t.timestamp=r.getTime(),"")}catch(t){return uo(`Problem parsing ${i} as ${n}, error was: `,t),e}}:(e,t)=>e.match(/^\d+$/)?(uo("it has an index"),t.index=parseInt(e,10),""):e];return e=>{let t={filename:e,index:0,isCompressed:!1};return i.reduce(((e,n)=>n(e,t)),e)?null:t}},yo=co;var go=class extends Co{constructor(e,t){if(lo(`constructor: creating RollingFileWriteStream. path=${e}`),"string"!=typeof e||0===e.length)throw new Error(`Invalid filename: ${e}`);if(e.endsWith(Do.sep))throw new Error(`Filename is a directory: ${e}`);0===e.indexOf(`~${Do.sep}`)&&(e=e.replace("~",po.homedir())),super(t),this.options=this._parseOption(t),this.fileObject=Do.parse(e),""===this.fileObject.dir&&(this.fileObject=Do.parse(Do.join(process.cwd(),e))),this.fileFormatter=mo({file:this.fileObject,alwaysIncludeDate:this.options.alwaysIncludePattern,needsIndex:this.options.maxSize 0`)}else delete n.maxSize;if(n.numBackups||0===n.numBackups){if(n.numBackups<0)throw new Error(`options.numBackups (${n.numBackups}) should be >= 0`);if(n.numBackups>=Number.MAX_SAFE_INTEGER)throw new Error(`options.numBackups (${n.numBackups}) should be < Number.MAX_SAFE_INTEGER`);n.numToKeep=n.numBackups+1}else if(n.numToKeep<=0)throw new Error(`options.numToKeep (${n.numToKeep}) should be > 0`);return lo(`_parseOption: creating stream with option=${JSON.stringify(n)}`),n}_final(e){this.currentFileStream.end("",this.options.encoding,e)}_write(e,t,n){this._shouldRoll().then((()=>{lo(`_write: writing chunk. file=${this.currentFileStream.path} state=${JSON.stringify(this.state)} chunk=${e}`),this.currentFileStream.write(e,t,(t=>{this.state.currentSize+=e.length,n(t)}))}))}async _shouldRoll(){(this._dateChanged()||this._tooBig())&&(lo(`_shouldRoll: rolling because dateChanged? ${this._dateChanged()} or tooBig? ${this._tooBig()}`),await this._roll())}_dateChanged(){return this.state.currentDate&&this.state.currentDate!==ho(this.options.pattern,Eo())}_tooBig(){return this.state.currentSize>=this.options.maxSize}_roll(){return lo("_roll: closing the current stream"),new Promise(((e,t)=>{this.currentFileStream.end("",this.options.encoding,(()=>{this._moveOldFiles().then(e).catch(t)}))}))}async _moveOldFiles(){const e=await this._getExistingFiles();for(let t=(this.state.currentDate?e.filter((e=>e.date===this.state.currentDate)):e).length;t>=0;t--){lo(`_moveOldFiles: i = ${t}`);const e=this.fileFormatter({date:this.state.currentDate,index:t}),n=this.fileFormatter({date:this.state.currentDate,index:t+1}),r={compress:this.options.compress&&0===t,mode:this.options.mode};await yo(e,n,r)}this.state.currentSize=0,this.state.currentDate=this.state.currentDate?ho(this.options.pattern,Eo()):null,lo(`_moveOldFiles: finished rolling files. state=${JSON.stringify(this.state)}`),this._renewWriteStream(),await new Promise(((e,t)=>{this.currentFileStream.write("","utf8",(()=>{this._clean().then(e).catch(t)}))}))}async _getExistingFiles(){const e=await fo.readdir(this.fileObject.dir).catch((()=>[]));lo(`_getExistingFiles: files=${e}`);const t=e.map((e=>this.fileNameParser(e))).filter((e=>e)),n=e=>(e.timestamp?e.timestamp:Eo().getTime())-e.index;return t.sort(((e,t)=>n(e)-n(t))),t}_renewWriteStream(){const e=this.fileFormatter({date:this.state.currentDate,index:0}),t=e=>{try{return fo.mkdirSync(e,{recursive:!0})}catch(n){if("ENOENT"===n.code)return t(Do.dirname(e)),t(e);if("EEXIST"!==n.code&&"EROFS"!==n.code)throw n;try{if(fo.statSync(e).isDirectory())return e;throw n}catch(e){throw n}}};t(this.fileObject.dir);const n={flags:this.options.flags,encoding:this.options.encoding,mode:this.options.mode};var r,u;fo.appendFileSync(e,"",(r={...n},u="flags",r["flag"]=r[u],delete r[u],r)),this.currentFileStream=fo.createWriteStream(e,n),this.currentFileStream.on("error",(e=>{this.emit("error",e)}))}async _clean(){const e=await this._getExistingFiles();if(lo(`_clean: numToKeep = ${this.options.numToKeep}, existingFiles = ${e.length}`),lo("_clean: existing files are: ",e),this._tooManyFiles(e.length)){const n=e.slice(0,e.length-this.options.numToKeep).map((e=>Do.format({dir:this.fileObject.dir,base:e.filename})));await(t=n,lo(`deleteFiles: files to delete: ${t}`),Promise.all(t.map((e=>fo.unlink(e).catch((t=>{lo(`deleteFiles: error when unlinking ${e}, ignoring. Error was ${t}`)}))))))}var t}_tooManyFiles(e){return this.options.numToKeep>0&&e>this.options.numToKeep}};const Ao=go;var vo=class extends Ao{constructor(e,t,n,r){r||(r={}),t&&(r.maxSize=t),r.numBackups||0===r.numBackups||(n||0===n||(n=1),r.numBackups=n),super(e,r),this.backups=r.numBackups,this.size=this.options.maxSize}get theStream(){return this.currentFileStream}};const So=go;var wo={RollingFileWriteStream:go,RollingFileStream:vo,DateRollingFileStream:class extends So{constructor(e,t,n){t&&"object"==typeof t&&(n=t,t=null),n||(n={}),t||(t="yyyy-MM-dd"),n.pattern=t,n.numBackups||0===n.numBackups?n.daysToKeep=n.numBackups:(n.daysToKeep||0===n.daysToKeep?process.emitWarning("options.daysToKeep is deprecated due to the confusion it causes when used together with file size rolling. Please use options.numBackups instead.","DeprecationWarning","streamroller-DEP0001"):n.daysToKeep=1,n.numBackups=n.daysToKeep),super(e,n),this.mode=this.options.mode}get theStream(){return this.currentFileStream}}};const Oo=$.exports("log4js:file"),_o=e,bo=wo,Bo=t,xo=Bo.EOL;let Po=!1;const Io=new Set;function No(){Io.forEach((e=>{e.sighupHandler()}))}wt.configure=function(e,t){let n=t.basicLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),e.mode=e.mode||384,function(e,t,n,r,u,o){if("string"!=typeof e||0===e.length)throw new Error(`Invalid filename: ${e}`);if(e.endsWith(_o.sep))throw new Error(`Filename is a directory: ${e}`);function i(e,t,n,r){const u=new bo.RollingFileStream(e,t,n,r);return u.on("error",(t=>{console.error("log4js.fileAppender - Writing to file %s, error happened ",e,t)})),u.on("drain",(()=>{process.emit("log4js:pause",!1)})),u}e=e.replace(new RegExp(`^~(?=${_o.sep}.+)`),Bo.homedir()),e=_o.normalize(e),Oo("Creating file appender (",e,", ",n,", ",r=r||0===r?r:5,", ",u,", ",o,")");let s=i(e,n,r,u);const a=function(e){if(s.writable){if(!0===u.removeColor){const t=/\x1b[[0-9;]*m/g;e.data=e.data.map((e=>"string"==typeof e?e.replace(t,""):e))}s.write(t(e,o)+xo,"utf8")||process.emit("log4js:pause",!0)}};return a.reopen=function(){s.end((()=>{s=i(e,n,r,u)}))},a.sighupHandler=function(){Oo("SIGHUP handler called."),a.reopen()},a.shutdown=function(e){Io.delete(a),0===Io.size&&Po&&(process.removeListener("SIGHUP",No),Po=!1),s.end("","utf-8",e)},Io.add(a),Po||(process.on("SIGHUP",No),Po=!0),a}(e.filename,n,e.maxLogSize,e.backups,e,e.timezoneOffset)};var To={};const ko=wo,Ro=t.EOL;function Mo(e,t,n,r,u){r.maxSize=r.maxLogSize;const o=function(e,t,n){const r=new ko.DateRollingFileStream(e,t,n);return r.on("error",(t=>{console.error("log4js.dateFileAppender - Writing to file %s, error happened ",e,t)})),r.on("drain",(()=>{process.emit("log4js:pause",!1)})),r}(e,t,r),i=function(e){o.writable&&(o.write(n(e,u)+Ro,"utf8")||process.emit("log4js:pause",!0))};return i.shutdown=function(e){o.end("","utf-8",e)},i}To.configure=function(e,t){let n=t.basicLayout;return e.layout&&(n=t.layout(e.layout.type,e.layout)),e.alwaysIncludePattern||(e.alwaysIncludePattern=!1),e.mode=e.mode||384,Mo(e.filename,e.pattern,n,e,e.timezoneOffset)};var Lo={};const jo=$.exports("log4js:fileSync"),$o=e,Ho=n,Go=t,Vo=Go.EOL;function Jo(e,t){const n=e=>{try{return Ho.mkdirSync(e,{recursive:!0})}catch(t){if("ENOENT"===t.code)return n($o.dirname(e)),n(e);if("EEXIST"!==t.code&&"EROFS"!==t.code)throw t;try{if(Ho.statSync(e).isDirectory())return e;throw t}catch(e){throw t}}};n($o.dirname(e)),Ho.appendFileSync(e,"",{mode:t.mode,flag:t.flags})}class Uo{constructor(e,t,n,r){if(jo("In RollingFileStream"),t<0)throw new Error(`maxLogSize (${t}) should be > 0`);this.filename=e,this.size=t,this.backups=n,this.options=r,this.currentSize=0,this.currentSize=function(e){let t=0;try{t=Ho.statSync(e).size}catch(t){Jo(e,r)}return t}(this.filename)}shouldRoll(){return jo("should roll with current size %d, and max size %d",this.currentSize,this.size),this.currentSize>=this.size}roll(e){const t=this,n=new RegExp(`^${$o.basename(e)}`);function r(e){return n.test(e)}function u(t){return parseInt(t.slice(`${$o.basename(e)}.`.length),10)||0}function o(e,t){return u(e)-u(t)}function i(n){const r=u(n);if(jo(`Index of ${n} is ${r}`),0===t.backups)Ho.truncateSync(e,0);else if(r ${e}.${r+1}`),Ho.renameSync($o.join($o.dirname(e),n),`${e}.${r+1}`)}}jo("Rolling, rolling, rolling"),jo("Renaming the old files"),Ho.readdirSync($o.dirname(e)).filter(r).sort(o).reverse().forEach(i)}write(e,t){const n=this;jo("in write"),this.shouldRoll()&&(this.currentSize=0,this.roll(this.filename)),jo("writing the chunk to the file"),n.currentSize+=e.length,Ho.appendFileSync(n.filename,e)}}Lo.configure=function(e,t){let n=t.basicLayout;e.layout&&(n=t.layout(e.layout.type,e.layout));const r={flags:e.flags||"a",encoding:e.encoding||"utf8",mode:e.mode||384};return function(e,t,n,r,u,o){if("string"!=typeof e||0===e.length)throw new Error(`Invalid filename: ${e}`);if(e.endsWith($o.sep))throw new Error(`Filename is a directory: ${e}`);e=e.replace(new RegExp(`^~(?=${$o.sep}.+)`),Go.homedir()),e=$o.normalize(e),jo("Creating fileSync appender (",e,", ",n,", ",r=r||0===r?r:5,", ",u,", ",o,")");const i=function(e,t,n){let r;var o;return t?r=new Uo(e,t,n,u):(Jo(o=e,u),r={write(e){Ho.appendFileSync(o,e)}}),r}(e,n,r);return e=>{i.write(t(e,o)+Vo)}}(e.filename,n,e.maxLogSize,e.backups,r,e.timezoneOffset)};var Wo={};const zo=$.exports("log4js:tcp"),Ko=D;Wo.configure=function(e,t){zo(`configure with config = ${e}`);let n=function(e){return e.serialise()};return e.layout&&(n=t.layout(e.layout.type,e.layout)),function(e,t){let n=!1;const r=[];let u,o=3,i="__LOG4JS__";function s(e){zo("Writing log event to socket"),n=u.write(`${t(e)}${i}`,"utf8")}function a(){let e;for(zo("emptying buffer");e=r.shift();)s(e)}function c(e){n?s(e):(zo("buffering log event because it cannot write at the moment"),r.push(e))}return function t(){zo(`appender creating socket to ${e.host||"localhost"}:${e.port||5e3}`),i=`${e.endMsg||"__LOG4JS__"}`,u=Ko.createConnection(e.port||5e3,e.host||"localhost"),u.on("connect",(()=>{zo("socket connected"),a(),n=!0})),u.on("drain",(()=>{zo("drain event received, emptying buffer"),n=!0,a()})),u.on("timeout",u.end.bind(u)),u.on("error",(e=>{zo("connection error",e),n=!1,a()})),u.on("close",t)}(),c.shutdown=function(e){zo("shutdown called"),r.length&&o?(zo("buffer has items, waiting 100ms to empty"),o-=1,setTimeout((()=>{c.shutdown(e)}),100)):(u.removeAllListeners("close"),u.end(e))},c}(e,n)};const qo=e,Yo=$.exports("log4js:appenders"),Zo=ce,Xo=ft,Qo=Pe,ei=_e,ti=Dt,ni=new Map;ni.set("console",ht),ni.set("stdout",mt),ni.set("stderr",Ft),ni.set("logLevelFilter",yt),ni.set("categoryFilter",gt),ni.set("noLogFilter",vt),ni.set("file",wt),ni.set("dateFile",To),ni.set("fileSync",Lo),ni.set("tcp",Wo);const ri=new Map,ui=(e,t)=>{let n;try{const t=`${e}.cjs`;n=require.resolve(t),Yo("Loading module from ",t)}catch(t){n=e,Yo("Loading module from ",e)}try{return require(n)}catch(n){return void Zo.throwExceptionIf(t,"MODULE_NOT_FOUND"!==n.code,`appender "${e}" could not be loaded (error was: ${n})`)}},oi=new Set,ii=(e,t)=>{if(ri.has(e))return ri.get(e);if(!t.appenders[e])return!1;if(oi.has(e))throw new Error(`Dependency loop detected for appender ${e}.`);oi.add(e),Yo(`Creating appender ${e}`);const n=si(e,t);return oi.delete(e),ri.set(e,n),n},si=(e,t)=>{const n=t.appenders[e],r=n.type.configure?n.type:((e,t)=>ni.get(e)||ui(`./${e}`,t)||ui(e,t)||require.main&&require.main.filename&&ui(qo.join(qo.dirname(require.main.filename),e),t)||ui(qo.join(process.cwd(),e),t))(n.type,t);return Zo.throwExceptionIf(t,Zo.not(r),`appender "${e}" is not valid (type "${n.type}" could not be found)`),r.appender&&(process.emitWarning(`Appender ${n.type} exports an appender function.`,"DeprecationWarning","log4js-node-DEP0001"),Yo("[log4js-node-DEP0001]",`DEPRECATION: Appender ${n.type} exports an appender function.`)),r.shutdown&&(process.emitWarning(`Appender ${n.type} exports a shutdown function.`,"DeprecationWarning","log4js-node-DEP0002"),Yo("[log4js-node-DEP0002]",`DEPRECATION: Appender ${n.type} exports a shutdown function.`)),Yo(`${e}: clustering.isMaster ? ${Xo.isMaster()}`),Yo(`${e}: appenderModule is ${i.inspect(r)}`),Xo.onlyOnMaster((()=>(Yo(`calling appenderModule.configure for ${e} / ${n.type}`),r.configure(ti.modifyConfig(n),ei,(e=>ii(e,t)),Qo))),(()=>{}))},ai=e=>{if(ri.clear(),oi.clear(),!e)return;const t=[];Object.values(e.categories).forEach((e=>{t.push(...e.appenders)})),Object.keys(e.appenders).forEach((n=>{(t.includes(n)||"tcp-server"===e.appenders[n].type||"multiprocess"===e.appenders[n].type)&&ii(n,e)}))},ci=()=>{ai()};ci(),Zo.addListener((e=>{Zo.throwExceptionIf(e,Zo.not(Zo.anObject(e.appenders)),'must have a property "appenders" of type object.');const t=Object.keys(e.appenders);Zo.throwExceptionIf(e,Zo.not(t.length),"must define at least one appender."),t.forEach((t=>{Zo.throwExceptionIf(e,Zo.not(e.appenders[t].type),`appender "${t}" is not valid (must be an object with property "type")`)}))})),Zo.addListener(ai),Ie.exports=ri,Ie.exports.init=ci;var li={exports:{}};!function(e){const t=$.exports("log4js:categories"),n=ce,r=Pe,u=Ie.exports,o=new Map;function i(e,t,n){if(!1===t.inherit)return;const r=n.lastIndexOf(".");if(r<0)return;const u=n.slice(0,r);let o=e.categories[u];o||(o={inherit:!0,appenders:[]}),i(e,o,u),!e.categories[u]&&o.appenders&&o.appenders.length&&o.level&&(e.categories[u]=o),t.appenders=t.appenders||[],t.level=t.level||o.level,o.appenders.forEach((e=>{t.appenders.includes(e)||t.appenders.push(e)})),t.parent=o}function s(e){if(!e.categories)return;Object.keys(e.categories).forEach((t=>{const n=e.categories[t];i(e,n,t)}))}n.addPreProcessingListener((e=>s(e))),n.addListener((e=>{n.throwExceptionIf(e,n.not(n.anObject(e.categories)),'must have a property "categories" of type object.');const t=Object.keys(e.categories);n.throwExceptionIf(e,n.not(t.length),"must define at least one category."),t.forEach((t=>{const o=e.categories[t];n.throwExceptionIf(e,[n.not(o.appenders),n.not(o.level)],`category "${t}" is not valid (must be an object with properties "appenders" and "level")`),n.throwExceptionIf(e,n.not(Array.isArray(o.appenders)),`category "${t}" is not valid (appenders must be an array of appender names)`),n.throwExceptionIf(e,n.not(o.appenders.length),`category "${t}" is not valid (appenders must contain at least one appender name)`),Object.prototype.hasOwnProperty.call(o,"enableCallStack")&&n.throwExceptionIf(e,"boolean"!=typeof o.enableCallStack,`category "${t}" is not valid (enableCallStack must be boolean type)`),o.appenders.forEach((r=>{n.throwExceptionIf(e,n.not(u.get(r)),`category "${t}" is not valid (appender "${r}" is not defined)`)})),n.throwExceptionIf(e,n.not(r.getLevel(o.level)),`category "${t}" is not valid (level "${o.level}" not recognised; valid levels are ${r.levels.join(", ")})`)})),n.throwExceptionIf(e,n.not(e.categories.default),'must define a "default" category.')}));const a=e=>{if(o.clear(),!e)return;Object.keys(e.categories).forEach((n=>{const i=e.categories[n],s=[];i.appenders.forEach((e=>{s.push(u.get(e)),t(`Creating category ${n}`),o.set(n,{appenders:s,level:r.getLevel(i.level),enableCallStack:i.enableCallStack||!1})}))}))},c=()=>{a()};c(),n.addListener(a);const l=e=>{if(t(`configForCategory: searching for config for ${e}`),o.has(e))return t(`configForCategory: ${e} exists in config, returning it`),o.get(e);let n;return e.indexOf(".")>0?(t(`configForCategory: ${e} has hierarchy, cloning from parents`),n={...l(e.slice(0,e.lastIndexOf(".")))}):(o.has("default")||a({categories:{default:{appenders:["out"],level:"OFF"}}}),t("configForCategory: cloning default category"),n={...o.get("default")}),o.set(e,n),n};e.exports=o,e.exports=Object.assign(e.exports,{appendersForCategory:e=>l(e).appenders,getLevelForCategory:e=>l(e).level,setLevelForCategory:(e,t)=>{l(e).level=t},getEnableCallStackForCategory:e=>!0===l(e).enableCallStack,setEnableCallStackForCategory:(e,t)=>{l(e).enableCallStack=t},init:c})}(li);const fi=$.exports("log4js:logger"),Di=Xe,di=Pe,pi=ft,Ei=li.exports,hi=ce,Ci=/at (?:(.+)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/;function mi(e,t=4){try{const n=e.stack.split("\n").slice(t);if(!n.length)return null;const r=Ci.exec(n[0]);if(r&&6===r.length){let e="",t="",u="";return r[1]&&""!==r[1]&&([t,u]=r[1].replace(/[[\]]/g,"").split(" as "),u=u||"",t.includes(".")&&([e,t]=t.split("."))),{fileName:r[2],lineNumber:parseInt(r[3],10),columnNumber:parseInt(r[4],10),callStack:n.join("\n"),className:e,functionName:t,functionAlias:u,callerName:r[1]||""}}console.error("log4js.logger - defaultParseCallStack error")}catch(e){console.error("log4js.logger - defaultParseCallStack error",e)}return null}let Fi=class{constructor(e){if(!e)throw new Error("No category provided.");this.category=e,this.context={},this.callStackSkipIndex=0,this.parseCallStack=mi,fi(`Logger created (${this.category}, ${this.level})`)}get level(){return di.getLevel(Ei.getLevelForCategory(this.category),di.OFF)}set level(e){Ei.setLevelForCategory(this.category,di.getLevel(e,this.level))}get useCallStack(){return Ei.getEnableCallStackForCategory(this.category)}set useCallStack(e){Ei.setEnableCallStackForCategory(this.category,!0===e)}get callStackLinesToSkip(){return this.callStackSkipIndex}set callStackLinesToSkip(e){if("number"!=typeof e)throw new TypeError("Must be a number");if(e<0)throw new RangeError("Must be >= 0");this.callStackSkipIndex=e}log(e,...t){const n=di.getLevel(e);n?this.isLevelEnabled(n)&&this._log(n,t):hi.validIdentifier(e)&&t.length>0?(this.log(di.WARN,"log4js:logger.log: valid log-level not found as first parameter given:",e),this.log(di.INFO,`[${e}]`,...t)):this.log(di.INFO,e,...t)}isLevelEnabled(e){return this.level.isLessThanOrEqualTo(e)}_log(e,t){fi(`sending log data (${e}) to appenders`);const n=t.find((e=>e instanceof Error));let r;if(this.useCallStack){try{n&&(r=this.parseCallStack(n,this.callStackSkipIndex+1))}catch(e){}r=r||this.parseCallStack(new Error,this.callStackSkipIndex+3+1)}const u=new Di(this.category,e,t,this.context,r,n);pi.send(u)}addContext(e,t){this.context[e]=t}removeContext(e){delete this.context[e]}clearContext(){this.context={}}setParseCallStackFunction(e){if("function"==typeof e)this.parseCallStack=e;else{if(void 0!==e)throw new TypeError("Invalid type passed to setParseCallStackFunction");this.parseCallStack=mi}}};function yi(e){const t=di.getLevel(e),n=t.toString().toLowerCase().replace(/_([a-z])/g,(e=>e[1].toUpperCase())),r=n[0].toUpperCase()+n.slice(1);Fi.prototype[`is${r}Enabled`]=function(){return this.isLevelEnabled(t)},Fi.prototype[n]=function(...e){this.log(t,...e)}}di.levels.forEach(yi),hi.addListener((()=>{di.levels.forEach(yi)}));var gi=Fi;const Ai=Pe;function vi(e){return e.originalUrl||e.url}function Si(e,t){for(let n=0;n{if(void 0!==e._logging)return i();if("function"!=typeof t.nolog){const n=function(e){let t=null;if(e instanceof RegExp&&(t=e),"string"==typeof e&&(t=new RegExp(e)),Array.isArray(e)){const n=e.map((e=>e.source?e.source:e));t=new RegExp(n.join("|"))}return t}(t.nolog);if(n&&n.test(e.originalUrl))return i()}if(n.isLevelEnabled(r)||"auto"===t.level){const i=new Date,{writeHead:s}=o;e._logging=!0,o.writeHead=(e,t)=>{o.writeHead=s,o.writeHead(e,t),o.__statusCode=e,o.__headers=t||{}};let a=!1;const c=()=>{if(a)return;if(a=!0,"function"==typeof t.nolog&&!0===t.nolog(e,o))return void(e._logging=!1);o.responseTime=new Date-i,o.statusCode&&"auto"===t.level&&(r=Ai.INFO,o.statusCode>=300&&(r=Ai.WARN),o.statusCode>=400&&(r=Ai.ERROR)),r=function(e,t,n){let r=t;if(n){const t=n.find((t=>{let n=!1;return n=t.from&&t.to?e>=t.from&&e<=t.to:-1!==t.codes.indexOf(e),n}));t&&(r=Ai.getLevel(t.level,r))}return r}(o.statusCode,r,t.statusRules);const s=function(e,t,n){const r=[];return r.push({token:":url",replacement:vi(e)}),r.push({token:":protocol",replacement:e.protocol}),r.push({token:":hostname",replacement:e.hostname}),r.push({token:":method",replacement:e.method}),r.push({token:":status",replacement:t.__statusCode||t.statusCode}),r.push({token:":response-time",replacement:t.responseTime}),r.push({token:":date",replacement:(new Date).toUTCString()}),r.push({token:":referrer",replacement:e.headers.referer||e.headers.referrer||""}),r.push({token:":http-version",replacement:`${e.httpVersionMajor}.${e.httpVersionMinor}`}),r.push({token:":remote-addr",replacement:e.headers["x-forwarded-for"]||e.ip||e._remoteAddress||e.socket&&(e.socket.remoteAddress||e.socket.socket&&e.socket.socket.remoteAddress)}),r.push({token:":user-agent",replacement:e.headers["user-agent"]}),r.push({token:":content-length",replacement:t.getHeader("content-length")||t.__headers&&t.__headers["Content-Length"]||"-"}),r.push({token:/:req\[([^\]]+)]/g,replacement:(t,n)=>e.headers[n.toLowerCase()]}),r.push({token:/:res\[([^\]]+)]/g,replacement:(e,n)=>t.getHeader(n.toLowerCase())||t.__headers&&t.__headers[n]}),(e=>{const t=e.concat();for(let e=0;eSi(e,s)));t&&n.log(r,t)}else n.log(r,Si(u,s));t.context&&n.removeContext("res")};o.on("end",c),o.on("finish",c),o.on("error",c),o.on("close",c)}return i()}},Hi=Bi;let Gi=!1;function Vi(e){if(!Gi)return;xi("Received log event ",e);Mi.appendersForCategory(e.categoryName).forEach((t=>{t(e)}))}function Ji(e){Gi&&Ui();let t=e;return"string"==typeof t&&(t=function(e){xi(`Loading configuration from ${e}`);try{return JSON.parse(Pi.readFileSync(e,"utf8"))}catch(t){throw new Error(`Problem reading config from file "${e}". Error was ${t.message}`,t)}}(e)),xi(`Configuration is ${t}`),Ni.configure(Ii(t)),ji.onMessage(Vi),Gi=!0,Wi}function Ui(e=(()=>{})){if("function"!=typeof e)throw new TypeError("Invalid callback passed to shutdown");xi("Shutdown called. Disabling all log writing."),Gi=!1;const t=Array.from(Ri.values());Ri.init(),Mi.init();const n=t.reduce(((e,t)=>t.shutdown?e+1:e),0);0===n&&(xi("No appenders with shutdown functions found."),e());let r,u=0;function o(t){r=r||t,u+=1,xi(`Appender shutdowns complete: ${u} / ${n}`),u>=n&&(xi("All shutdown functions completed."),e(r))}xi(`Found ${n} appenders with shutdown functions.`),t.filter((e=>e.shutdown)).forEach((e=>e.shutdown(o)))}const Wi={getLogger:function(e){return Gi||Ji(process.env.LOG4JS_CONFIG||{appenders:{out:{type:"stdout"}},categories:{default:{appenders:["out"],level:"OFF"}}}),new Li(e||"default")},configure:Ji,shutdown:Ui,connectLogger:$i,levels:ki,addLayout:Ti.addLayout,recording:function(){return Hi}};var zi=Wi;!function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.addCustomPLlugin=e.addCustomTask=e.hvigorTrace=void 0;const t=zi;e.hvigorTrace={totalTime:0,moduleNum:0,taskTime:{},isIncremental:!0,hasIncremental:!1,isParallel:!0,IS_DAEMON:!0,LOG_LEVEL:t.levels.INFO.levelStr,IS_HVIGORFILE_TYPE_CHECK:!1},e.addCustomTask=function(t){var n;let r=null!==(n=e.hvigorTrace.CUSTOM_TASKS)&&void 0!==n?n:[];r.length>0&&(r=r.filter((e=>e.NAME!==t.NAME))),r.push(t),e.hvigorTrace.CUSTOM_TASKS=r},e.addCustomPLlugin=function(t){var n;let r=null!==(n=e.hvigorTrace.CUSTOM_PLUGINS)&&void 0!==n?n:[];r.length>0&&(r=r.filter((e=>e.PLUGIN_ID!==t.PLUGIN_ID))),r.push({PLUGIN_ID:t.PLUGIN_ID}),e.hvigorTrace.CUSTOM_PLUGINS=r}}(j);var Ki={};!function(e){var t=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.hashFile=e.hash=e.createHash=void 0;const r=t(d),u=t(n);e.createHash=(e="MD5")=>r.default.createHash(e);e.hash=(t,n)=>(0,e.createHash)(n).update(t).digest("hex");e.hashFile=(t,n)=>{if(u.default.existsSync(t))return(0,e.hash)(u.default.readFileSync(t,"utf-8"),n)}}(Ki);var qi={},Yi={},Zi={};Object.defineProperty(Zi,"__esModule",{value:!0}),Zi.Unicode=void 0;class Xi{}Zi.Unicode=Xi,Xi.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,Xi.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,Xi.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(Yi,"__esModule",{value:!0}),Yi.JudgeUtil=void 0;const Qi=Zi;Yi.JudgeUtil=class{static isIgnoreChar(e){return"string"==typeof e&&("\t"===e||"\v"===e||"\f"===e||" "===e||" "===e||"\ufeff"===e||"\n"===e||"\r"===e||"\u2028"===e||"\u2029"===e)}static isSpaceSeparator(e){return"string"==typeof e&&Qi.Unicode.SPACE_SEPARATOR.test(e)}static isIdStartChar(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||"$"===e||"_"===e||Qi.Unicode.ID_START.test(e))}static isIdContinueChar(e){return"string"==typeof e&&(e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"$"===e||"_"===e||"‌"===e||"‍"===e||Qi.Unicode.ID_CONTINUE.test(e))}static isDigitWithoutZero(e){return/[1-9]/.test(e)}static isDigit(e){return"string"==typeof e&&/[0-9]/.test(e)}static isHexDigit(e){return"string"==typeof e&&/[0-9A-Fa-f]/.test(e)}};var es=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(qi,"__esModule",{value:!0}),qi.parseJsonText=qi.parseJsonFile=void 0;const ts=es(n),ns=es(t),rs=es(e),us=Yi;var os;!function(e){e[e.Char=0]="Char",e[e.EOF=1]="EOF",e[e.Identifier=2]="Identifier"}(os||(os={}));let is,ss,as,cs,ls,fs,Ds="start",ds=[],ps=0,Es=1,hs=0,Cs=!1,ms="default",Fs="'",ys=1;function gs(e,t=!1){ss=String(e),Ds="start",ds=[],ps=0,Es=1,hs=0,cs=void 0,Cs=t;do{is=As(),Bs[Ds]()}while("eof"!==is.type);return cs}function As(){for(ms="default",ls="",Fs="'",ys=1;;){fs=vs();const e=ws[ms]();if(e)return e}}function vs(){if(ss[ps])return String.fromCodePoint(ss.codePointAt(ps))}function Ss(){const e=vs();return"\n"===e?(Es++,hs=0):e?hs+=e.length:hs++,e&&(ps+=e.length),e}qi.parseJsonFile=function(e,t=!1,n="utf-8"){const r=ts.default.readFileSync(rs.default.resolve(e),{encoding:n});try{return gs(r,t)}catch(t){if(t instanceof SyntaxError){const n=t.message.split("at");if(2===n.length)throw new Error(`${n[0].trim()}${ns.default.EOL}\t at ${e}:${n[1].trim()}`)}throw new Error(`${e} is not in valid JSON/JSON5 format.`)}},qi.parseJsonText=gs;const ws={default(){switch(fs){case"/":return Ss(),void(ms="comment");case void 0:return Ss(),Os("eof")}if(!us.JudgeUtil.isIgnoreChar(fs)&&!us.JudgeUtil.isSpaceSeparator(fs))return ws[Ds]();Ss()},start(){ms="value"},beforePropertyName(){switch(fs){case"$":case"_":return ls=Ss(),void(ms="identifierName");case"\\":return Ss(),void(ms="identifierNameStartEscape");case"}":return Os("punctuator",Ss());case'"':case"'":return Fs=fs,Ss(),void(ms="string")}if(us.JudgeUtil.isIdStartChar(fs))return ls+=Ss(),void(ms="identifierName");throw Ns(os.Char,Ss())},afterPropertyName(){if(":"===fs)return Os("punctuator",Ss());throw Ns(os.Char,Ss())},beforePropertyValue(){ms="value"},afterPropertyValue(){switch(fs){case",":case"}":return Os("punctuator",Ss())}throw Ns(os.Char,Ss())},beforeArrayValue(){if("]"===fs)return Os("punctuator",Ss());ms="value"},afterArrayValue(){switch(fs){case",":case"]":return Os("punctuator",Ss())}throw Ns(os.Char,Ss())},end(){throw Ns(os.Char,Ss())},comment(){switch(fs){case"*":return Ss(),void(ms="multiLineComment");case"/":return Ss(),void(ms="singleLineComment")}throw Ns(os.Char,Ss())},multiLineComment(){switch(fs){case"*":return Ss(),void(ms="multiLineCommentAsterisk");case void 0:throw Ns(os.Char,Ss())}Ss()},multiLineCommentAsterisk(){switch(fs){case"*":return void Ss();case"/":return Ss(),void(ms="default");case void 0:throw Ns(os.Char,Ss())}Ss(),ms="multiLineComment"},singleLineComment(){switch(fs){case"\n":case"\r":case"\u2028":case"\u2029":return Ss(),void(ms="default");case void 0:return Ss(),Os("eof")}Ss()},value(){switch(fs){case"{":case"[":return Os("punctuator",Ss());case"n":return Ss(),_s("ull"),Os("null",null);case"t":return Ss(),_s("rue"),Os("boolean",!0);case"f":return Ss(),_s("alse"),Os("boolean",!1);case"-":case"+":return"-"===Ss()&&(ys=-1),void(ms="numerical");case".":case"0":case"I":case"N":return void(ms="numerical");case'"':case"'":return Fs=fs,Ss(),ls="",void(ms="string")}if(void 0===fs||!us.JudgeUtil.isDigitWithoutZero(fs))throw Ns(os.Char,Ss());ms="numerical"},numerical(){switch(fs){case".":return ls=Ss(),void(ms="decimalPointLeading");case"0":return ls=Ss(),void(ms="zero");case"I":return Ss(),_s("nfinity"),Os("numeric",ys*(1/0));case"N":return Ss(),_s("aN"),Os("numeric",NaN)}if(void 0!==fs&&us.JudgeUtil.isDigitWithoutZero(fs))return ls=Ss(),void(ms="decimalInteger");throw Ns(os.Char,Ss())},zero(){switch(fs){case".":case"e":case"E":return void(ms="decimal");case"x":case"X":return ls+=Ss(),void(ms="hexadecimal")}return Os("numeric",0)},decimalInteger(){switch(fs){case".":case"e":case"E":return void(ms="decimal")}if(!us.JudgeUtil.isDigit(fs))return Os("numeric",ys*Number(ls));ls+=Ss()},decimal(){switch(fs){case".":ls+=Ss(),ms="decimalFraction";break;case"e":case"E":ls+=Ss(),ms="decimalExponent"}},decimalPointLeading(){if(us.JudgeUtil.isDigit(fs))return ls+=Ss(),void(ms="decimalFraction");throw Ns(os.Char,Ss())},decimalFraction(){switch(fs){case"e":case"E":return ls+=Ss(),void(ms="decimalExponent")}if(!us.JudgeUtil.isDigit(fs))return Os("numeric",ys*Number(ls));ls+=Ss()},decimalExponent(){switch(fs){case"+":case"-":return ls+=Ss(),void(ms="decimalExponentSign")}if(us.JudgeUtil.isDigit(fs))return ls+=Ss(),void(ms="decimalExponentInteger");throw Ns(os.Char,Ss())},decimalExponentSign(){if(us.JudgeUtil.isDigit(fs))return ls+=Ss(),void(ms="decimalExponentInteger");throw Ns(os.Char,Ss())},decimalExponentInteger(){if(!us.JudgeUtil.isDigit(fs))return Os("numeric",ys*Number(ls));ls+=Ss()},hexadecimal(){if(us.JudgeUtil.isHexDigit(fs))return ls+=Ss(),void(ms="hexadecimalInteger");throw Ns(os.Char,Ss())},hexadecimalInteger(){if(!us.JudgeUtil.isHexDigit(fs))return Os("numeric",ys*Number(ls));ls+=Ss()},identifierNameStartEscape(){if("u"!==fs)throw Ns(os.Char,Ss());Ss();const e=bs();switch(e){case"$":case"_":break;default:if(!us.JudgeUtil.isIdStartChar(e))throw Ns(os.Identifier)}ls+=e,ms="identifierName"},identifierName(){switch(fs){case"$":case"_":case"‌":case"‍":return void(ls+=Ss());case"\\":return Ss(),void(ms="identifierNameEscape")}if(!us.JudgeUtil.isIdContinueChar(fs))return Os("identifier",ls);ls+=Ss()},identifierNameEscape(){if("u"!==fs)throw Ns(os.Char,Ss());Ss();const e=bs();switch(e){case"$":case"_":case"‌":case"‍":break;default:if(!us.JudgeUtil.isIdContinueChar(e))throw Ns(os.Identifier)}ls+=e,ms="identifierName"},string(){switch(fs){case"\\":return Ss(),void(ls+=function(){const e=vs(),t=function(){switch(vs()){case"b":return Ss(),"\b";case"f":return Ss(),"\f";case"n":return Ss(),"\n";case"r":return Ss(),"\r";case"t":return Ss(),"\t";case"v":return Ss(),"\v"}return}();if(t)return t;switch(e){case"0":if(Ss(),us.JudgeUtil.isDigit(vs()))throw Ns(os.Char,Ss());return"\0";case"x":return Ss(),function(){let e="",t=vs();if(!us.JudgeUtil.isHexDigit(t))throw Ns(os.Char,Ss());if(e+=Ss(),t=vs(),!us.JudgeUtil.isHexDigit(t))throw Ns(os.Char,Ss());return e+=Ss(),String.fromCodePoint(parseInt(e,16))}();case"u":return Ss(),bs();case"\n":case"\u2028":case"\u2029":return Ss(),"";case"\r":return Ss(),"\n"===vs()&&Ss(),""}if(void 0===e||us.JudgeUtil.isDigitWithoutZero(e))throw Ns(os.Char,Ss());return Ss()}());case'"':case"'":if(fs===Fs){const e=Os("string",ls);return Ss(),e}return void(ls+=Ss());case"\n":case"\r":case void 0:throw Ns(os.Char,Ss());case"\u2028":case"\u2029":!function(e){console.warn(`JSON5: '${Is(e)}' in strings is not valid ECMAScript; consider escaping.`)}(fs)}ls+=Ss()}};function Os(e,t){return{type:e,value:t,line:Es,column:hs}}function _s(e){for(const t of e){if(vs()!==t)throw Ns(os.Char,Ss());Ss()}}function bs(){let e="",t=4;for(;t-- >0;){const t=vs();if(!us.JudgeUtil.isHexDigit(t))throw Ns(os.Char,Ss());e+=Ss()}return String.fromCodePoint(parseInt(e,16))}const Bs={start(){if("eof"===is.type)throw Ns(os.EOF);xs()},beforePropertyName(){switch(is.type){case"identifier":case"string":return as=is.value,void(Ds="afterPropertyName");case"punctuator":return void Ps();case"eof":throw Ns(os.EOF)}},afterPropertyName(){if("eof"===is.type)throw Ns(os.EOF);Ds="beforePropertyValue"},beforePropertyValue(){if("eof"===is.type)throw Ns(os.EOF);xs()},afterPropertyValue(){if("eof"===is.type)throw Ns(os.EOF);switch(is.value){case",":return void(Ds="beforePropertyName");case"}":Ps()}},beforeArrayValue(){if("eof"===is.type)throw Ns(os.EOF);"punctuator"!==is.type||"]"!==is.value?xs():Ps()},afterArrayValue(){if("eof"===is.type)throw Ns(os.EOF);switch(is.value){case",":return void(Ds="beforeArrayValue");case"]":Ps()}},end(){}};function xs(){const e=function(){let e;switch(is.type){case"punctuator":switch(is.value){case"{":e={};break;case"[":e=[]}break;case"null":case"boolean":case"numeric":case"string":e=is.value}return e}();if(Cs&&"object"==typeof e&&(e._line=Es,e._column=hs),void 0===cs)cs=e;else{const t=ds[ds.length-1];Array.isArray(t)?Cs&&"object"!=typeof e?t.push({value:e,_line:Es,_column:hs}):t.push(e):t[as]=Cs&&"object"!=typeof e?{value:e,_line:Es,_column:hs}:e}!function(e){if(e&&"object"==typeof e)ds.push(e),Ds=Array.isArray(e)?"beforeArrayValue":"beforePropertyName";else{const e=ds[ds.length-1];Ds=e?Array.isArray(e)?"afterArrayValue":"afterPropertyValue":"end"}}(e)}function Ps(){ds.pop();const e=ds[ds.length-1];Ds=e?Array.isArray(e)?"afterArrayValue":"afterPropertyValue":"end"}function Is(e){const t={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(t[e])return t[e];if(e<" "){const t=e.charCodeAt(0).toString(16);return`\\x${`00${t}`.substring(t.length)}`}return e}function Ns(e,t){let n="";switch(e){case os.Char:n=void 0===t?`JSON5: invalid end of input at ${Es}:${hs}`:`JSON5: invalid character '${Is(t)}' at ${Es}:${hs}`;break;case os.EOF:n=`JSON5: invalid end of input at ${Es}:${hs}`;break;case os.Identifier:hs-=5,n=`JSON5: invalid identifier character at ${Es}:${hs}`}const r=new Ts(n);return r.lineNumber=Es,r.columnNumber=hs,r}class Ts extends SyntaxError{}var ks={},Rs=p&&p.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),Ms=p&&p.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Ls=p&&p.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Rs(t,e,n);return Ms(t,e),t},js=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ks,"__esModule",{value:!0}),ks.isFileExists=ks.offlinePluginConversion=ks.executeCommand=ks.getNpmPath=ks.hasNpmPackInPaths=void 0;const $s=r,Hs=js(n),Gs=Ls(e),Vs=E,Js=S;ks.hasNpmPackInPaths=function(e,t){try{return require.resolve(e,{paths:[...t]}),!0}catch(e){return!1}},ks.getNpmPath=function(){const e=process.execPath;return Gs.join(Gs.dirname(e),Vs.NPM_TOOL)},ks.executeCommand=function(e,t,n){0!==(0,$s.spawnSync)(e,t,n).status&&(0,Js.logErrorAndExit)(`Error: ${e} ${t} execute failed.See above for details.`)},ks.offlinePluginConversion=function(e,t){return t.startsWith("file:")||t.endsWith(".tgz")?Gs.resolve(e,Vs.HVIGOR,t.replace("file:","")):t},ks.isFileExists=function(e){return Hs.default.existsSync(e)&&Hs.default.statSync(e).isFile()};var Us={};!function(u){var o=p&&p.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=p&&p.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=p&&p.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&o(t,e,n);return i(t,e),t},a=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(u,"__esModule",{value:!0}),u.executeInstallPnpm=u.isPnpmInstalled=u.environmentHandler=u.checkNpmConifg=u.PNPM_VERSION=void 0;const c=r,l=s(n),f=a(t),D=s(e),d=E,h=S,C=ks;u.PNPM_VERSION="7.30.0",u.checkNpmConifg=function(){const e=D.resolve(d.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),t=D.resolve(f.default.homedir(),".npmrc");if((0,C.isFileExists)(e)||(0,C.isFileExists)(t))return;const n=(0,C.getNpmPath)(),r=(0,c.spawnSync)(n,["config","get","prefix"],{cwd:d.HVIGOR_PROJECT_ROOT_DIR});if(0!==r.status||!r.stdout)return void(0,h.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const u=D.resolve(`${r.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,C.isFileExists)(u)||(0,h.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},u.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},u.isPnpmInstalled=function(){return!!l.existsSync(d.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,C.hasNpmPackInPaths)("pnpm",[d.HVIGOR_WRAPPER_TOOLS_HOME])},u.executeInstallPnpm=function(){(0,h.logInfo)(`Installing pnpm@${u.PNPM_VERSION}...`);const e=(0,C.getNpmPath)();!function(){const e=D.resolve(d.HVIGOR_WRAPPER_TOOLS_HOME,d.DEFAULT_PACKAGE_JSON);try{l.existsSync(d.HVIGOR_WRAPPER_TOOLS_HOME)||l.mkdirSync(d.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const t={dependencies:{}};t.dependencies[d.PNPM]=u.PNPM_VERSION,l.writeFileSync(e,JSON.stringify(t))}catch(t){(0,h.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${e} failed.`)}}(),(0,C.executeCommand)(e,["install","pnpm"],{cwd:d.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,h.logInfo)("Pnpm install success.")}}(Us);var Ws=p&&p.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var u=Object.getOwnPropertyDescriptor(t,n);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,u)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),zs=p&&p.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Ks=p&&p.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&Ws(t,e,n);return zs(t,e),t},qs=p&&p.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(L,"__esModule",{value:!0});var Ys=L.initProjectWorkSpace=void 0;const Zs=Ks(n),Xs=qs(t),Qs=Ks(e),ea=qs(u),ta=j,na=E,ra=Ki,ua=qi,oa=S,ia=ks,sa=Us;let aa,ca,la;function fa(e,t,n){return void 0!==n.dependencies&&(0,ia.offlinePluginConversion)(na.HVIGOR_PROJECT_ROOT_DIR,t.dependencies[e])===Qs.normalize(n.dependencies[e])}Ys=L.initProjectWorkSpace=function(){if(aa=function(){const e=Qs.resolve(na.HVIGOR_PROJECT_WRAPPER_HOME,na.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);Zs.existsSync(e)||(0,oa.logErrorAndExit)(`Error: Hvigor config file ${e} does not exist.`);return(0,ua.parseJsonFile)(e)}(),la=function(e){let t;t=function(e){const t=e.hvigorVersion;if(t.startsWith("file:")||t.endsWith(".tgz"))return!1;const n=e.dependencies,r=Object.getOwnPropertyNames(n);for(const e of r){const t=n[e];if(t.startsWith("file:")||t.endsWith(".tgz"))return!1}if(1===r.length&&"@ohos/hvigor-ohos-plugin"===r[0])return t>"2.5.0";return!1}(e)?function(e){let t=`${na.HVIGOR_ENGINE_PACKAGE_NAME}@${e.hvigorVersion}`;const n=e.dependencies;if(n){Object.getOwnPropertyNames(n).sort().forEach((e=>{t+=`,${e}@${n[e]}`}))}return(0,ra.hash)(t)}(e):(0,ra.hash)(ea.default.cwd());return Qs.resolve(Xs.default.homedir(),".hvigor","project_caches",t)}(aa),ca=function(){const e=Qs.resolve(la,na.WORK_SPACE,na.DEFAULT_PACKAGE_JSON);return Zs.existsSync(e)?(0,ua.parseJsonFile)(e):{dependencies:{}}}(),function(){const e=Qs.resolve(na.HVIGOR_USER_HOME,na.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);if(Zs.existsSync(e))(0,ua.parseJsonFile)(e)}(),!(0,ia.hasNpmPackInPaths)(na.HVIGOR_ENGINE_PACKAGE_NAME,[Qs.join(la,na.WORK_SPACE)])||(0,ia.offlinePluginConversion)(na.HVIGOR_PROJECT_ROOT_DIR,aa.hvigorVersion)!==ca.dependencies[na.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function e(e){const t=null==e?void 0:e.dependencies;return void 0===t?0:Object.getOwnPropertyNames(t).length}const t=e(aa),n=e(ca);if(t+1!==n)return!1;for(const e in null==aa?void 0:aa.dependencies)if(!(0,ia.hasNpmPackInPaths)(e,[Qs.join(la,na.WORK_SPACE)])||!fa(e,aa,ca))return!1;return!0}())try{const e=ea.default.hrtime();(0,sa.checkNpmConifg)(),function(){(0,oa.logInfo)("Hvigor installing...");for(const e in aa.dependencies)aa.dependencies[e]&&(aa.dependencies[e]=(0,ia.offlinePluginConversion)(na.HVIGOR_PROJECT_ROOT_DIR,aa.dependencies[e]));const e={dependencies:{...aa.dependencies}};e.dependencies[na.HVIGOR_ENGINE_PACKAGE_NAME]=(0,ia.offlinePluginConversion)(na.HVIGOR_PROJECT_ROOT_DIR,aa.hvigorVersion);const t=Qs.join(la,na.WORK_SPACE);try{Zs.mkdirSync(t,{recursive:!0});const n=Qs.resolve(t,na.DEFAULT_PACKAGE_JSON);Zs.writeFileSync(n,JSON.stringify(e))}catch(e){(0,oa.logErrorAndExit)(e)}(function(){const e=["config","set","store-dir",na.HVIGOR_PNPM_STORE_PATH],t={cwd:Qs.join(la,na.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,ia.executeCommand)(na.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,e,t)})(),function(){const e=["install"],t={cwd:Qs.join(la,na.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,ia.executeCommand)(na.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,e,t)}(),(0,oa.logInfo)("Hvigor install success.")}();const t=ea.default.hrtime(e);ta.hvigorTrace.HVIGOR_INSTALL_TIME=1e9*t[0]+t[1]}catch(e){!function(){const e=Qs.join(la,na.WORK_SPACE);if((0,oa.logInfo)("Hvigor cleaning..."),!Zs.existsSync(e))return;const t=Zs.readdirSync(e);if(!t||0===t.length)return;const n=Qs.resolve(la,"node_modules","@ohos","hvigor","bin","hvigor.js");Zs.existsSync(n)&&(0,ia.executeCommand)(ea.default.argv[0],[n,"--stop-daemon"],{});try{t.forEach((t=>{Zs.rmSync(Qs.resolve(e,t),{recursive:!0})}))}catch(t){(0,oa.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${e}.`)}}()}return la},function(){Us.environmentHandler(),Us.isPnpmInstalled()||(Us.checkNpmConifg(),Us.executeInstallPnpm());const t=Ys();b(e.join(t,E.WORK_SPACE))}(); ================================================ FILE: vibration_ohos/example/ohos/hvigorfile.ts ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { appTasks } from '@ohos/hvigor-ohos-plugin'; export default { system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ } ================================================ FILE: vibration_ohos/example/ohos/hvigorw ================================================ #!/bin/bash # Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ---------------------------------------------------------------------------- # Hvigor startup script, version 1.0.0 # # Required ENV vars: # ------------------ # NODE_HOME - location of a Node home dir # or # Add /usr/local/nodejs/bin to the PATH environment variable # ---------------------------------------------------------------------------- HVIGOR_APP_HOME=$(dirname $(readlink -f $0)) HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js warn() { echo "" echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" } error() { echo "" echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" } fail() { error "$@" exit 1 } # Determine node to start hvigor wrapper script if [ -n "${NODE_HOME}" ];then EXECUTABLE_NODE="${NODE_HOME}/bin/node" if [ ! -x "$EXECUTABLE_NODE" ];then fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" fi else EXECUTABLE_NODE="node" which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path" fi # Check hvigor wrapper script if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" fi # start hvigor-wrapper script exec "${EXECUTABLE_NODE}" \ "${HVIGOR_WRAPPER_SCRIPT}" "$@" ================================================ FILE: vibration_ohos/example/ohos/hvigorw.bat ================================================ @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Hvigor startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js set NODE_EXE=node.exe goto start :start @rem Find node.exe if defined NODE_HOME goto findNodeFromNodeHome %NODE_EXE% --version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. echo. echo Please set the NODE_HOME variable in your environment to match the echo location of your NodeJs installation. goto fail :findNodeFromNodeHome set NODE_HOME=%NODE_HOME:"=% set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% if exist "%NODE_EXE_PATH%" goto execute echo. echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. echo. echo Please set the NODE_HOME variable in your environment to match the echo location of your NodeJs installation. goto fail :execute @rem Execute hvigor "%NODE_EXE%" %WRAPPER_MODULE_PATH% %* if "%ERRORLEVEL%" == "0" goto hvigorwEnd :fail exit /b 1 :hvigorwEnd if "%OS%" == "Windows_NT" endlocal :end ================================================ FILE: vibration_ohos/example/ohos/oh-package.json5 ================================================ { "name": "example", "version": "1.0.0", "description": "Please describe the basic information.", "main": "", "author": "", "license": "", "dependencies": { "@ohos/flutter_ohos": "file:./har/flutter.har" }, "devDependencies": { "@ohos/hypium": "1.0.6" }, "overrides": { "@ohos/flutter_ohos": "file:./har/flutter.har" } } ================================================ FILE: vibration_ohos/example/pubspec.yaml ================================================ name: vibration_example description: Demonstrates how to use the vibration_ohos plugin. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev environment: sdk: ^3.0.0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions # consider running `flutter pub upgrade --major-versions`. Alternatively, # dependencies can be manually updated by changing the version numbers below to # the latest version available on pub.dev. To see which dependencies have newer # versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter vibration: any vibration_ohos: # When depending on this package from a real application you should use: # vibration_ohos: ^x.y.z # See https://dart.dev/tools/pub/dependencies#version-constraints # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 flutter_platform_utils: ^1.0.0 # dependency_overrides: # vibration: # path: ../../vibration # vibration_platform_interface: # path: ../vibration_platform_interface dev_dependencies: flutter_test: sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true assets: - assets/haptic_file.json # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware # For details regarding adding assets from package dependencies, see # https://flutter.dev/assets-and-images/#from-packages # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages ================================================ FILE: vibration_ohos/lib/vibration_ohos.dart ================================================ library vibration_ohos; import 'dart:convert'; import 'package:device_info_plus_ohos/device_info_plus_ohos.dart'; import 'package:flutter/services.dart'; import 'package:vibration_platform_interface/vibration_platform_interface.dart'; export 'package:vibration_platform_interface/vibration_platform_interface.dart'; class VibrationOhos extends VibrationPlatform { /// Registers this class as the default instance of [VibrationOhos]. static void registerWith() { VibrationPlatform.instance = VibrationOhos(); } final DeviceInfoOhosPlugin ohosDeviceInfo = DeviceInfoOhosPlugin(); /// Method channel to communicate with native code. final MethodChannel _channel = const MethodChannel('vibration'); /// Check if vibrator is available on device. /// /// ```dart /// if (await Vibration.hasVibrator()) { /// Vibration.vibrate(); /// } /// ``` @override Future hasVibrator() async { try { final deviceData = await ohosDeviceInfo.ohosDeviceInfo; if (!deviceData.isPhysicalDevice) { return false; } return true; } on PlatformException { return false; } on UnsupportedError { return false; } } /// Check if the vibrator has amplitude control. /// /// ```dart /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(amplitude: 128); /// } /// ``` @override Future hasAmplitudeControl() async { try { final deviceData = await ohosDeviceInfo.ohosDeviceInfo; if (!deviceData.isPhysicalDevice) { return false; } return true; } on PlatformException { return false; } on UnsupportedError { return false; } } /// Check if the device is able to vibrate with a custom /// [duration], [pattern] or [intensities]. /// May return `true` even if the device has no vibrator. /// /// ```dart /// if (await Vibration.hasCustomVibrationsSupport()) { /// Vibration.vibrate(duration: 1000); /// } else { /// Vibration.vibrate(); /// await Future.delayed(Duration(milliseconds: 500)); /// Vibration.vibrate(); /// } /// ``` @override Future hasCustomVibrationsSupport() async { try { return true; } on MissingPluginException { return Future.value(false); } } /// Vibrate with [duration] at [amplitude] or [pattern] at [intensities]. /// /// The default vibration duration is 500ms. /// Amplitude is a range from 1 to 255, if supported. /// /// ```dart /// Vibration.vibrate(duration: 1000); /// /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(duration: 1000, amplitude: 1); /// Vibration.vibrate(duration: 1000, amplitude: 255); /// } /// ``` @override Future vibrate({ int duration = 500, List pattern = const [], int repeat = -1, List intensities = const [], int amplitude = -1, double sharpness = 1.0, // ohos only VibrateEffect? vibrateEffect, // ohos only VibrateAttribute vibrateAttribute = const VibrateAttribute(), }) => _channel.invokeMethod( "vibrate", { "vibrateEffect": (vibrateEffect ?? (repeat > 0 ? VibratePreset(count: repeat) : VibrateTime(duration: duration))) .toMap(), "vibrateAttribute": vibrateAttribute.toString(), }, ); /// This method is used to cancel an ongoing vibration. /// iOS: only works for custom haptic vibrations using `CHHapticEngine. /// /// ```dart /// Vibration.vibrate(duration: 10000); /// Vibration.cancel(); /// ``` @override Future cancel() => _channel.invokeMethod("cancel"); } /// vibration effect. /// 马达振动效果。 mixin VibrateEffect { Map toMap(); @override String toString() { return jsonEncode(toMap()); } } /// See also: https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-vibrator.md#vibrateeffect9 class VibrateTime with VibrateEffect { /// The duration of continuous motor vibration, in milliseconds. /// 马达持续振动时长, 单位ms。 final int duration; const VibrateTime({ required this.duration, }); @override Map toMap() { return { 'type': 'time', 'duration': duration, }; } } /// See also: https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-vibrator.md#vibrateeffect9 class VibratePreset with VibrateEffect { /// 预置的振动效果ID。 final String effectId; /// 重复振动的次数。 final int count; const VibratePreset({ this.effectId = 'haptic.clock.timer', required this.count, }); @override Map toMap() { return { 'type': 'preset', 'effectId': effectId, 'count': count, }; } } /// TODO: OpenHarmony not support for now /// See also: https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-vibrator.md#vibrateeffect9 class VibrateFromFile with VibrateEffect { final HapticFileDescriptor hapticFd; const VibrateFromFile({ required this.hapticFd, }); @override Map toMap() { return { 'type': 'file', 'hapticFd': hapticFd.toMap(), }; } } /// Descriptor for custom vibration configuration file /// Custom vibration types, supported by only some devices /// 自定义振动配置文件的描述符 /// 自定义振动类型,仅部分设备支持 class HapticFileDescriptor { final int? offset; final int? length; final Uint8List data; const HapticFileDescriptor({ this.offset, this.length, required this.data, }); Map toMap() { return { if (offset != null) 'offset': offset, if (length != null) 'length': length, 'data': data, }; } } /// 马达振动属性。 class VibrateAttribute { final int? id; /// 'unknown' | 'alarm' | 'ring' | /// 'notification' | 'communication' | 'touch' | /// 'media' | 'physicalFeedback' | 'simulateReality'; /// unknown 没有明确使用场景,最低优先级。 /// alarm 用于警报场景。 /// ring 用于铃声场景。 /// notification 用于通知场景。 /// communication 用于通信场景。 /// touch 用于触摸场景。 /// media 用于多媒体场景。 /// physicalFeedback 用于物理反馈场景。 /// simulateReality 用于模拟现实场景。 final String usage; const VibrateAttribute({ this.id, this.usage = 'unknown', }); Map toMap() { return { if (id != null) 'id': id, 'usage': usage, }; } @override String toString() { return jsonEncode(toMap()); } } ================================================ FILE: vibration_ohos/ohos/.gitignore ================================================ /node_modules /oh_modules /.preview /.idea /build /.cxx /.test /BuildProfile.ets /oh-package-lock.json5 ================================================ FILE: vibration_ohos/ohos/build-profile.json5 ================================================ { "apiType": "stageMode", "buildOption": { }, "targets": [ { "name": "default" } ] } ================================================ FILE: vibration_ohos/ohos/hvigorfile.ts ================================================ // Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. export { harTasks } from '@ohos/hvigor-ohos-plugin'; ================================================ FILE: vibration_ohos/ohos/index.ets ================================================ /* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import VibrationPlugin from './src/main/ets/components/plugin/VibrationOhosPlugin'; export default VibrationPlugin; ================================================ FILE: vibration_ohos/ohos/oh-package.json5 ================================================ { "name": "vibration_ohos", "version": "1.0.0", "description": "Please describe the basic information.", "main": "index.ets", "author": "", "license": "Apache-2.0", "dependencies": { "@ohos/flutter_ohos": "file:./har/flutter.har" } } ================================================ FILE: vibration_ohos/ohos/src/main/ets/components/plugin/VibrationOhosPlugin.ets ================================================ import { FlutterPlugin, FlutterPluginBinding, MethodCall, MethodCallHandler, MethodChannel, MethodResult, } from '@ohos/flutter_ohos'; import vibrator from '@ohos.vibrator'; import { BusinessError } from '@kit.BasicServicesKit'; import fs from '@ohos.file.fs'; import { Context } from '@kit.AbilityKit'; /** VibrationPlugin **/ export default class VibrationPlugin implements FlutterPlugin, MethodCallHandler { private channel: MethodChannel | null = null; private context: Context | null = null; constructor() { } getUniqueClassName(): string { return "VibrationPlugin" } onAttachedToEngine(binding: FlutterPluginBinding): void { this.channel = new MethodChannel(binding.getBinaryMessenger(), "vibration"); this.channel.setMethodCallHandler(this) this.context = binding.getApplicationContext(); } onDetachedFromEngine(binding: FlutterPluginBinding): void { if (this.channel != null) { this.channel.setMethodCallHandler(null) } this.context = null; } async onMethodCall(call: MethodCall, result: MethodResult): Promise { if (call.method == "vibrate") { try { let args: Map = call.args; let vibrateEffectObject: Map = args.get('vibrateEffect'); let file: fs.File | null; let type: string = vibrateEffectObject.get('type'); let vibrateEffect: vibrator.VibrateEffect | null = null; switch (type) { case 'file': let hapticFd: Map = vibrateEffectObject.get('hapticFd'); let data: Uint8Array = hapticFd.get('data'); let cacheDir = this.context?.tempDir; file = fs.openSync(cacheDir + `/${new Date().getTime()}.json`, fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE); // let writeLen = await fs.write(file.fd, content); let writeLen = await fs.write(file.fd, data.buffer); fs.closeSync(file.fd); file = fs.openSync(file.path, fs.OpenMode.CREATE); vibrateEffect = { type: 'file', hapticFd: { fd: file.fd, offset: hapticFd.get('offset'), length: hapticFd.get('length'), }, }; break; case 'time': vibrateEffect = { type: 'time', duration: vibrateEffectObject.get('duration'), }; break; case 'preset': vibrateEffect = { type: 'preset', count: vibrateEffectObject.get('count'), effectId: vibrateEffectObject.get('effectId'), }; break; default: break; } if (vibrateEffect != null) { let vibrateAttribute: vibrator.VibrateAttribute = JSON.parse(args.get('vibrateAttribute')); await vibrator.startVibration(vibrateEffect, vibrateAttribute,) .then(() => { if (file != null) { fs.close(file.fd); } console.info('Succeed in starting vibration'); }, (error: BusinessError) => { console.error(`Failed to start vibration. Code: ${error.code}, message: ${error.message}`); }); } result.success(null) } catch (err) { let e: BusinessError = err as BusinessError; result.error(e.code.toString(), e.message, e.stack ?? ''); } } else if (call.method == "cancel") { try { await vibrator.stopVibration(); result.success(null) } catch (err) { let e: BusinessError = err as BusinessError; result.error(e.code.toString(), e.message, e.stack ?? ''); } } else { result.notImplemented() } } } ================================================ FILE: vibration_ohos/ohos/src/main/module.json5 ================================================ { "module": { "name": "vibration_ohos", "type": "har", "deviceTypes": [ "default", "tablet" ] } } ================================================ FILE: vibration_ohos/pubspec.yaml ================================================ name: vibration_ohos description: The OpenHarmony implementation of vibration. version: 0.0.4 homepage: https://github.com/benjamindean/flutter_vibration environment: sdk: ">=3.0.0 <4.0.0" flutter: ">=3.0.0" dependencies: flutter: sdk: flutter vibration_platform_interface: ^0.1.1 device_info_plus_ohos: ">=0.0.7 <1.0.0" # dependency_overrides: # vibration_platform_interface: # path: ../vibration_platform_interface dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # This section identifies this Flutter project as a plugin project. # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) # which should be registered in the plugin registry. This is required for # using method channels. # The Android 'package' specifies package in which the registered class is. # This is required for using method channels on Android. # The 'ffiPlugin' specifies that native code should be built and bundled. # This is required for using `dart:ffi`. # All these are used by the tooling to maintain consistency when # adding or updating assets for this project. plugin: platforms: ohos: pluginClass: VibrationPlugin dartPluginClass: VibrationOhos # To add assets to your plugin package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # # For details regarding assets in packages, see # https://flutter.dev/assets-and-images/#from-packages # # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware # To add custom fonts to your plugin package, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts in packages, see # https://flutter.dev/custom-fonts/#from-packages ================================================ FILE: vibration_platform_interface/.gitignore ================================================ # Miscellaneous *.class *.log *.pyc *.swp .DS_Store .atom/ .buildlog/ .history .svn/ migrate_working_dir/ # IntelliJ related *.iml *.ipr *.iws .idea/ # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. #.vscode/ # Flutter/Dart/Pub related # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. /pubspec.lock **/doc/api/ .dart_tool/ .packages build/ .flutter-plugins .metadata ================================================ FILE: vibration_platform_interface/CHANGELOG.md ================================================ ## 0.1.2 - Bump package `device_info_plus` to ">=9.0.2 <14.0.0" ## 0.1.1 - Bump package `device_info_plus` to ">=9.0.2 <13.0.0" ## 0.1.0 - Add sharpness parameter for iOS. ## 0.0.2 - Update package `device_info_plus` to ">=9.0.2 <12.0.0" ## 0.0.1 - Initial open-source release. ================================================ FILE: vibration_platform_interface/LICENSE ================================================ BSD 2-Clause License Copyright (c) 2018, Benjamin Dean All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vibration_platform_interface/README.md ================================================ # vibration_platform_interface [![pub package](https://img.shields.io/pub/v/vibration_platform_interface.svg)](https://pub.dev/packages/vibration_platform_interface) A common platform interface for [`vibration`](https://pub.dev/packages/vibration). ## Usage This package is already included as part of the `vibration` package dependency, and will be included when using `vibration` as normal. ================================================ FILE: vibration_platform_interface/lib/src/method_channel_vibration.dart ================================================ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/services.dart'; import 'package:vibration_platform_interface/vibration_platform_interface.dart'; class MethodChannelVibration extends VibrationPlatform { final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); /// Method channel to communicate with native code. final MethodChannel _channel = const MethodChannel('vibration'); /// Check if vibrator is available on device. /// /// ```dart /// if (await Vibration.hasVibrator()) { /// Vibration.vibrate(); /// } /// ``` @override Future hasVibrator() async { try { if (Platform.isAndroid) { final deviceData = await deviceInfo.androidInfo; if (!deviceData.isPhysicalDevice) { return false; } return true; } else if (Platform.isIOS) { final deviceData = await deviceInfo.iosInfo; if (!deviceData.isPhysicalDevice) { return false; } return true; } } on PlatformException { return false; } on UnsupportedError { return false; } return false; } /// Check if the vibrator has amplitude control. /// /// ```dart /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(amplitude: 128); /// } /// ``` @override Future hasAmplitudeControl() async { try { if (Platform.isAndroid) { final deviceData = await deviceInfo.androidInfo; if (!deviceData.isPhysicalDevice) { return false; } return await _channel.invokeMethod("hasAmplitudeControl") ?? false; } else if (Platform.isIOS) { final deviceData = await deviceInfo.iosInfo; if (!deviceData.isPhysicalDevice) { return false; } return true; } } on PlatformException { return false; } on UnsupportedError { return false; } return false; } /// Check if the device is able to vibrate with a custom /// [duration], [pattern] or [intensities]. /// May return `true` even if the device has no vibrator. /// /// ```dart /// if (await Vibration.hasCustomVibrationsSupport()) { /// Vibration.vibrate(duration: 1000); /// } else { /// Vibration.vibrate(); /// await Future.delayed(Duration(milliseconds: 500)); /// Vibration.vibrate(); /// } /// ``` @override Future hasCustomVibrationsSupport() async { try { return await _channel.invokeMethod("hasCustomVibrationsSupport") ?? false; } on MissingPluginException { return Future.value(false); } } /// Vibrate with [duration] at [amplitude] or [pattern] at [intensities]. /// /// The default vibration duration is 500ms. /// Amplitude is a range from 1 to 255, if supported. /// /// ```dart /// Vibration.vibrate(duration: 1000); /// /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(duration: 1000, amplitude: 1); /// Vibration.vibrate(duration: 1000, amplitude: 255); /// } /// ``` @override Future vibrate({ int duration = 500, List pattern = const [], int repeat = -1, List intensities = const [], int amplitude = -1, double sharpness = 0.5, }) => _channel.invokeMethod( "vibrate", { "duration": duration, "pattern": pattern, "repeat": repeat, "amplitude": amplitude, "intensities": intensities, "sharpness": sharpness, }, ); /// This method is used to cancel an ongoing vibration. /// iOS: only works for custom haptic vibrations using `CHHapticEngine. /// /// ```dart /// Vibration.vibrate(duration: 10000); /// Vibration.cancel(); /// ``` @override Future cancel() => _channel.invokeMethod("cancel"); } ================================================ FILE: vibration_platform_interface/lib/vibration_platform_interface.dart ================================================ library vibration_platform_interface; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'src/method_channel_vibration.dart'; /// The interface that implementations of device_info must implement. /// /// Platform implementations should extend this class rather than implement it as `device_info` /// does not consider newly added methods to be breaking changes. Extending this class /// (using `extends`) ensures that the subclass will get the default implementation, while /// platform implementations that `implements` this interface will be broken by newly added /// [VibrationPlatform] methods. abstract class VibrationPlatform extends PlatformInterface { /// Constructs a UrlLauncherPlatform. VibrationPlatform() : super(token: _token); static final Object _token = Object(); static VibrationPlatform _instance = MethodChannelVibration(); /// The default instance of [VibrationPlatform] to use. /// /// Defaults to [MethodChannelVibration]. static VibrationPlatform get instance => _instance; /// Platform-specific plugins should set this with their own platform-specific /// class that extends [VibrationPlatform] when they register themselves. static set instance(VibrationPlatform instance) { PlatformInterface.verifyToken(instance, _token); _instance = instance; } /// Check if vibrator is available on device. /// /// ```dart /// if (await Vibration.hasVibrator()) { /// Vibration.vibrate(); /// } /// ``` Future hasVibrator() async { throw UnimplementedError('deviceInfo() has not been implemented.'); } /// Check if the vibrator has amplitude control. /// /// ```dart /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(amplitude: 128); /// } /// ``` Future hasAmplitudeControl() async { throw UnimplementedError('deviceInfo() has not been implemented.'); } /// Check if the device is able to vibrate with a custom /// [duration], [pattern] or [intensities]. /// May return `true` even if the device has no vibrator. /// /// ```dart /// if (await Vibration.hasCustomVibrationsSupport()) { /// Vibration.vibrate(duration: 1000); /// } else { /// Vibration.vibrate(); /// await Future.delayed(Duration(milliseconds: 500)); /// Vibration.vibrate(); /// } /// ``` Future hasCustomVibrationsSupport() async { throw UnimplementedError('deviceInfo() has not been implemented.'); } /// Vibrate with [duration] at [amplitude] or [pattern] at [intensities]. /// /// The default vibration duration is 500ms. /// Amplitude is a range from 1 to 255, if supported. /// /// ```dart /// Vibration.vibrate(duration: 1000); /// /// if (await Vibration.hasAmplitudeControl()) { /// Vibration.vibrate(duration: 1000, amplitude: 1); /// Vibration.vibrate(duration: 1000, amplitude: 255); /// } /// ``` Future vibrate({ int duration = 500, List pattern = const [], int repeat = -1, List intensities = const [], int amplitude = -1, double sharpness = 0.5, }) { throw UnimplementedError('deviceInfo() has not been implemented.'); } /// This method is used to cancel an ongoing vibration. /// iOS: only works for custom haptic vibrations using `CHHapticEngine. /// /// ```dart /// Vibration.vibrate(duration: 10000); /// Vibration.cancel(); /// ``` Future cancel() { throw UnimplementedError('deviceInfo() has not been implemented.'); } } ================================================ FILE: vibration_platform_interface/pubspec.yaml ================================================ name: vibration_platform_interface description: A common platform interface for the vibration plugin. version: 0.1.2 homepage: https://github.com/benjamindean/flutter_vibration environment: sdk: ">=3.0.0 <4.0.0" flutter: ">=3.0.0" dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.1.4 device_info_plus: ">=9.0.2 <14.0.0" dev_dependencies: flutter_test: sdk: flutter # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # # For details regarding assets in packages, see # https://flutter.dev/assets-and-images/#from-packages # # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware # To add custom fonts to your package, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts in packages, see # https://flutter.dev/custom-fonts/#from-packages ================================================ FILE: vibration_web/.flutter-plugins ================================================ # This is a generated file; do not edit or check into version control. vibration_web=/Users/romanhome/Documents/GitHub/vibration/vibration_web/ ================================================ FILE: vibration_web/.gitignore ================================================ .DS_Store .dart_tool/ .packages .pub/ build/ ================================================ FILE: vibration_web/.metadata ================================================ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled and should not be manually edited. version: revision: 8b3760638a189741cd9ca881aa2dd237c1df1be5 channel: beta project_type: plugin ================================================ FILE: vibration_web/CHANGELOG.md ================================================ ## 1.6.8 - Adds support for `web: ^1.0.0` ## 1.6.7 - Migrate from dart:js to web package for Wasm support (#102 by [san-smith](https://github.com/san-smith)) ## 1.6.6 - Added Web support (#95 by [san-smith](https://github.com/san-smith)) ## 1.6.5 - Update package's dart SDK max version (under 3.0.0) ## 1.6.4 - Fix BinaryMessenger initialization. - Unify behavior between iOS and Android versions (#51 by [Leicas](https://github.com/Leicas)) ## 1.6.3-nullsafety.0 - Migrating to null safety. ## 1.6.2 - Fix building on iOS. ## 1.6.1 - Added Web support (#43 by [roulljdh](https://github.com/roulljdh)) ================================================ FILE: vibration_web/LICENSE ================================================ BSD 2-Clause License Copyright (c) 2018, Benjamin Dean All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: vibration_web/README.md ================================================ # Vibration The web implementation of [`vibration`][1]. ## Usage Once you have `vibration` in `pubspec.yaml` you should be able to use `package:vibration` as normal. [1]: ../vibration ================================================ FILE: vibration_web/ios/.gitignore ================================================ .idea/ .vagrant/ .sconsign.dblite .svn/ .DS_Store *.swp profile DerivedData/ build/ GeneratedPluginRegistrant.h GeneratedPluginRegistrant.m .generated/ *.pbxuser *.mode1v3 *.mode2v3 *.perspectivev3 !default.pbxuser !default.mode1v3 !default.mode2v3 !default.perspectivev3 xcuserdata *.moved-aside *.pyc *sync/ Icon? .tags* /Flutter/Generated.xcconfig ================================================ FILE: vibration_web/ios/vibration_web.podspec ================================================ # # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html # Pod::Spec.new do |s| s.name = 'vibration_web' s.version = '1.6.4' s.summary = 'Web implmentation of Vibration plugin' s.description = <<-DESC Web implmentation of Vibration plugin DESC s.homepage = 'https://github.com/benjamindean/flutter_vibration' s.license = { :file => '../LICENSE' } s.author = { 'Benjamin Dean' => 'benjaminabel.cellardoor@gmail.com' } s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' s.platform = :ios, '8.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } s.swift_version = '5.0' end ================================================ FILE: vibration_web/lib/vibration_web.dart ================================================ import 'dart:async'; import 'dart:js_interop'; import 'dart:js_interop_unsafe'; import 'package:flutter/services.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:web/web.dart' as web; class VibrationWebPlugin { /// Get navigator JS object static final _navigator = web.window.navigator; static void registerWith(Registrar registrar) { final MethodChannel channel = MethodChannel( 'vibration', const StandardMethodCodec(), registrar, ); final VibrationWebPlugin pluginInstance = VibrationWebPlugin(); channel.setMethodCallHandler(pluginInstance.handleMethodCall); } /// Handles method calls over the MethodChannel of this plugin. /// Note: Check the "federated" architecture for a new way of doing this: /// https://flutter.dev/go/federated-plugins Future handleMethodCall(MethodCall call) async { switch (call.method) { case 'hasVibrator': return Future.value(_hasVibrator()); case 'vibrate': final int duration = call.arguments['duration']; final List pattern = call.arguments['pattern'].cast(); return Future.value(_vibrate(duration: duration, pattern: pattern)); case 'hasAmplitudeControl': case 'hasCustomVibrationsSupport': return Future.value(false); case 'cancel': return Future.value(_cancel()); default: throw PlatformException( code: 'Unimplemented', details: 'vibration_web doesn\'t implement \'${call.method}\'', ); } } static bool _hasVibrator() { /// Check if the navigator object has the vibrate function return _navigator.has('vibrate'); } static _vibrate({int duration = 500, List pattern = const []}) { if (_hasVibrator()) { /// If pattern is not empty, convert to JS array final args = pattern.length > 0 ? pattern.jsify() ?? duration.toJS : duration.toJS; /// Call vibrate function _navigator.vibrate(args); } } static _cancel() { _vibrate(duration: 0); } } ================================================ FILE: vibration_web/pubspec.yaml ================================================ name: vibration_web description: A plugin for handling Vibration API on the Web version: 1.6.8 homepage: https://github.com/benjamindean/flutter_vibration environment: sdk: ">=3.0.0 <4.0.0" flutter: ">=3.0.0" dependencies: flutter: sdk: flutter flutter_web_plugins: sdk: flutter web: ">=0.5.1 <2.0.0" dev_dependencies: flutter_test: sdk: flutter flutter: plugin: platforms: web: pluginClass: VibrationWebPlugin fileName: vibration_web.dart ================================================ FILE: vibration_web/vibration_web.iml ================================================