From 960d18b84759c7951aab031ebc26564186eeae37 Mon Sep 17 00:00:00 2001 From: Bryn Hakl Date: Sun, 8 Feb 2026 21:17:41 -0600 Subject: [PATCH] Update to v11.1.0 --- Blocks/build.gradle | 20 +- Blocks/proguard-rules.pro | 21 - Blocks/src/main/AndroidManifest.xml | 5 +- Blocks/src/main/assets/blocks/gamepad.js | 237 +++++--- .../main/assets/blocks/gobilda_pinpoint.js | 417 +++++++++++++ .../samples/ConceptGamepadEdgeDetection.blk | 152 +++++ Blocks/src/main/assets/toolbox/gamepad.xml | 33 ++ .../hardware/HardwareUtil.java | 47 ++ .../runtime/GamepadAccess.java | 143 +++++ .../runtime/GoBildaPinpointAccess.java | 102 ++++ FtcCommon/build.gradle | 26 +- FtcCommon/proguard-rules.pro | 21 - FtcCommon/src/main/AndroidManifest.xml | 5 +- FtcRobotController/build.gradle | 26 +- FtcRobotController/proguard-rules.pro | 21 - .../src/main/AndroidManifest.xml | 5 +- .../external/samples/ConceptAprilTag.java | 26 +- .../external/samples/ConceptAprilTagEasy.java | 26 +- .../ConceptAprilTagSwitchableCameras.java | 30 +- .../samples/ConceptGamepadEdgeDetection.java | 16 + .../ConceptExternalHardwareClass.java | 2 +- .../externalhardware/RobotHardware.java | 2 +- Hardware/build.gradle | 26 +- Hardware/proguard-rules.pro | 21 - Hardware/src/main/AndroidManifest.xml | 6 +- .../gobilda/GoBildaPinpointDriver.java | 561 ++++++++++++++++-- Inspection/build.gradle | 20 +- Inspection/proguard-rules.pro | 21 - Inspection/src/main/AndroidManifest.xml | 5 +- OnBotJava/build.gradle | 24 +- OnBotJava/libs/javac.jar | Bin 2388918 -> 2388918 bytes OnBotJava/proguard-rules.pro | 21 - OnBotJava/src/main/AndroidManifest.xml | 5 +- .../src/main/assets/java/js/worker/index.js | 176 +++--- .../main/assets/java/js/worker/index.js.map | 4 +- .../assets/java/templates/ConceptAprilTag | 26 +- .../assets/java/templates/ConceptAprilTagEasy | 26 +- .../ConceptAprilTagSwitchableCameras | 30 +- .../templates/ConceptGamepadEdgeDetection | 16 + .../ConceptExternalHardwareClass | 2 +- .../templates/externalhardware/RobotHardware | 2 +- .../ftc/onbotjava/JavaSourceFile.java | 2 + .../onbotjava/OnBotJavaProgrammingMode.java | 3 +- .../onbotjava/handlers/file/RenameFile.java | 143 +++++ RobotCore/CMakeLists.txt | 15 +- RobotCore/build.gradle | 63 +- RobotCore/libs/gson-extras-0.2.1.jar | Bin 26132 -> 0 bytes RobotCore/libs/slf4j-api-1.7.26.jar | Bin 39590 -> 0 bytes RobotCore/libs/slf4j-handroid-1.7.27.jar | Bin 8486 -> 8234 bytes RobotCore/proguard-rules.pro | 21 - RobotCore/src/main/AndroidManifest.xml | 9 +- .../eventloop/opmode/OpModeInternal.java | 2 + .../qualcomm/robotcore/hardware/Gamepad.java | 71 +++ .../hardware/GamepadStateChanges.java | 4 + .../com/qualcomm/robotcore/util/Version.java | 2 +- .../res/xml/builtinwebcamcalibrations.xml | 32 + RobotCore/versionNumbers.properties | 2 +- RobotServer/build.gradle | 27 +- ...Java-WebSocket-1.4.1-20190423.174615-6.jar | Bin 115890 -> 115890 bytes RobotServer/proguard-rules.pro | 21 - RobotServer/src/main/AndroidManifest.xml | 6 +- RobotServer/src/main/assets/java/android.jar | Bin 4052682 -> 4227530 bytes .../main/assets/java/onbotjava-classes.jar | Bin 3909864 -> 3921367 bytes TeamCode/build.gradle | 9 +- TeamCode/proguard-rules.pro | 21 - TeamCode/src/main/AndroidManifest.xml | 1 - .../org/firstinspires/ftc/teamcode/readme.md | 48 +- TeamCode/src/main/res/raw/readme.md | 1 + TeamCode/src/main/res/values/strings.xml | 1 + .../main/res/xml/teamwebcamcalibrations.xml | 161 +++++ Vision/build.gradle | 30 +- Vision/proguard-rules.pro | 21 - Vision/src/main/AndroidManifest.xml | 10 +- build.androidVersionCommon.gradle | 35 ++ build.common.gradle | 59 +- build.gradle | 25 +- combine.sh | 34 ++ maven_scraper.sh | 2 +- readme.md | 4 +- 79 files changed, 2390 insertions(+), 870 deletions(-) delete mode 100644 Blocks/proguard-rules.pro delete mode 100644 FtcCommon/proguard-rules.pro delete mode 100644 FtcRobotController/proguard-rules.pro delete mode 100644 Hardware/proguard-rules.pro delete mode 100644 Inspection/proguard-rules.pro delete mode 100644 OnBotJava/proguard-rules.pro create mode 100644 OnBotJava/src/main/java/org/firstinspires/ftc/onbotjava/handlers/file/RenameFile.java delete mode 100644 RobotCore/libs/gson-extras-0.2.1.jar delete mode 100644 RobotCore/libs/slf4j-api-1.7.26.jar delete mode 100644 RobotCore/proguard-rules.pro delete mode 100644 RobotServer/proguard-rules.pro delete mode 100644 TeamCode/proguard-rules.pro create mode 100644 TeamCode/src/main/res/raw/readme.md create mode 100644 TeamCode/src/main/res/xml/teamwebcamcalibrations.xml delete mode 100644 Vision/proguard-rules.pro create mode 100644 build.androidVersionCommon.gradle create mode 100755 combine.sh diff --git a/Blocks/build.gradle b/Blocks/build.gradle index 2b203709..aa6d1cd5 100644 --- a/Blocks/build.gradle +++ b/Blocks/build.gradle @@ -1,27 +1,13 @@ apply plugin: 'com.android.library' - -android.buildFeatures.buildConfig true +apply from: '../build.androidVersionCommon.gradle' android { - namespace 'com.google.blocks' - compileSdkVersion 29 - defaultConfig { - minSdkVersion 23 - targetSdkVersion 28 - versionCode 110 - versionName "22.1" + versionCode 115 + versionName "23.1" } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - } dependencies { diff --git a/Blocks/proguard-rules.pro b/Blocks/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/Blocks/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/Blocks/src/main/AndroidManifest.xml b/Blocks/src/main/AndroidManifest.xml index 9976aca4..b19aa584 100644 --- a/Blocks/src/main/AndroidManifest.xml +++ b/Blocks/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + - \ No newline at end of file + diff --git a/Blocks/src/main/assets/blocks/gamepad.js b/Blocks/src/main/assets/blocks/gamepad.js index d989aeca..7ff2d36b 100644 --- a/Blocks/src/main/assets/blocks/gamepad.js +++ b/Blocks/src/main/assets/blocks/gamepad.js @@ -22,6 +22,7 @@ // The following are defined in vars.js: // getPropertyColor +// setPropertyColor // functionColor function createGamepadDropdown() { @@ -75,6 +76,9 @@ Blockly.Blocks['gamepad_getProperty'] = { ['LeftStickX', 'LeftStickX'], ['LeftStickY', 'LeftStickY'], ['LeftTrigger', 'LeftTrigger'], + ['LeftTriggerPressed', 'LeftTriggerPressed'], + ['LeftTriggerWasPressed', 'LeftTriggerWasPressed'], + ['LeftTriggerWasReleased', 'LeftTriggerWasReleased'], ['Options', 'Options'], ['OptionsWasPressed', 'OptionsWasPressed'], ['OptionsWasReleased', 'OptionsWasReleased'], @@ -90,6 +94,9 @@ Blockly.Blocks['gamepad_getProperty'] = { ['RightStickX', 'RightStickX'], ['RightStickY', 'RightStickY'], ['RightTrigger', 'RightTrigger'], + ['RightTriggerPressed', 'RightTriggerPressed'], + ['RightTriggerWasPressed', 'RightTriggerWasPressed'], + ['RightTriggerWasReleased', 'RightTriggerWasReleased'], ['Share', 'Share'], ['ShareWasPressed', 'ShareWasPressed'], ['ShareWasReleased', 'ShareWasReleased'], @@ -111,6 +118,7 @@ Blockly.Blocks['gamepad_getProperty'] = { ['Triangle', 'Triangle'], ['TriangleWasPressed', 'TriangleWasPressed'], ['TriangleWasReleased', 'TriangleWasReleased'], + ['TriggerThreshold', 'TriggerThreshold'], ['X', 'X'], ['XWasPressed', 'XWasPressed'], ['XWasReleased', 'XWasReleased'], @@ -170,6 +178,9 @@ Blockly.Blocks['gamepad_getProperty'] = { ['LeftStickX', 'Returns a numeric value between -1.0 and +1.0 representing the left analog stick horizontal axis value.'], ['LeftStickY', 'Returns a numeric value between -1.0 and +1.0 representing the left analog stick vertical axis value.'], ['LeftTrigger', 'Returns a numeric value between 0.0 and +1.0 representing the left trigger value.'], + ['LeftTriggerPressed', 'Returns true if the left trigger is past the trigger threshold.'], + ['LeftTriggerWasPressed', 'Returns true if the left trigger was pressed since the last call of this block.'], + ['LeftTriggerWasReleased', 'Returns true if the left trigger was released since the last call of this block.'], ['Options', 'Returns true if the Options button is pressed.'], ['OptionsWasPressed', 'Returns true if the Options button was pressed since the last call of this block.'], ['OptionsWasReleased', 'Returns true if the Options button was released since the last call of this block.'], @@ -185,6 +196,9 @@ Blockly.Blocks['gamepad_getProperty'] = { ['RightStickX', 'Returns a numeric value between -1.0 and +1.0 representing the right analog stick horizontal axis value.'], ['RightStickY', 'Returns a numeric value between -1.0 and +1.0 representing the right analog stick vertical axis value .'], ['RightTrigger', 'Returns a numeric value between 0.0 and +1.0 representing the right trigger value.'], + ['RightTriggerPressed', 'Returns true if the right trigger is past the trigger threshold.'], + ['RightTriggerWasPressed', 'Returns true if the right trigger was pressed since the last call of this block.'], + ['RightTriggerWasReleased', 'Returns true if the right trigger was released since the last call of this block.'], ['Share', 'Returns true if the Share button is pressed.'], ['ShareWasPressed', 'Returns true if the Share button was pressed since the last call of this block.'], ['ShareWasReleased', 'Returns true if the Share button was released since the last call of this block.'], @@ -199,13 +213,14 @@ Blockly.Blocks['gamepad_getProperty'] = { ['TouchpadWasReleased', 'Returns true if the Touchpad button was released since the last call of this block.'], ['TouchpadFinger1', 'Returns true if the Touchpad is tracking finger ID # 1.'], ['TouchpadFinger2', 'Returns true if the Touchpad is tracking finger ID # 2.'], - ['TouchpadFinger1X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], - ['TouchpadFinger1Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], - ['TouchpadFinger2X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], - ['TouchpadFinger2Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], + ['TouchpadFinger1X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], + ['TouchpadFinger1Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], + ['TouchpadFinger2X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], + ['TouchpadFinger2Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], ['Triangle', 'Returns true if the Triangle button is pressed.'], ['TriangleWasPressed', 'Returns true if the Triangle button was pressed since the last call of this block.'], ['TriangleWasReleased', 'Returns true if the Triangle button was released since the last call of this block.'], + ['TriggerThreshold', 'Returns the threshold for determining if a trigger is pressed.'], ['X', 'Returns true if the X button is pressed.'], ['XWasPressed', 'Returns true if the X button was pressed since the last call of this block.'], ['XWasReleased', 'Returns true if the X button was released since the last call of this block.'], @@ -241,10 +256,10 @@ Blockly.FtcJava['gamepad_getProperty'] = function(block) { code = 'a'; break; case 'AWasPressed': - code = 'a_was_pressed()'; + code = 'aWasPressed()'; break; case 'AWasReleased': - code = 'a_was_released()'; + code = 'aWasReleased()'; break; case 'AtRest': code = 'atRest()'; @@ -253,226 +268,208 @@ Blockly.FtcJava['gamepad_getProperty'] = function(block) { code = 'b'; break; case 'BWasPressed': - code = 'b_was_pressed()'; + code = 'bWasPressed()'; break; case 'BWasReleased': - code = 'b_was_released()'; + code = 'bWasReleased()'; break; case 'Back': code = 'back'; break; case 'BackWasPressed': - code = 'back_was_pressed()'; + code = 'backWasPressed()'; break; case 'BackWasReleased': - code = 'back_was_released()'; + code = 'backWasReleased()'; break; case 'Circle': code = 'circle'; break; case 'CircleWasPressed': - code = 'circle_was_pressed()'; + code = 'circleWasPressed()'; break; case 'CircleWasReleased': - code = 'circle_was_released()'; + code = 'circleWasReleased()'; break; case 'Cross': code = 'cross'; break; case 'CrossWasPressed': - code = 'cross_was_pressed()'; + code = 'crossWasPressed()'; break; case 'CrossWasReleased': - code = 'cross_was_released()'; + code = 'crossWasReleased()'; break; case 'DpadDown': code = 'dpad_down'; break; case 'DpadDownWasPressed': - code = 'dpad_down_was_pressed()'; + code = 'dpadDownWasPressed()'; break; case 'DpadDownWasReleased': - code = 'dpad_down_was_released()'; + code = 'dpadDownWasReleased()'; break; case 'DpadLeft': code = 'dpad_left'; break; case 'DpadLeftWasPressed': - code = 'dpad_left_was_pressed()'; + code = 'dpadLeftWasPressed()'; break; case 'DpadLeftWasReleased': - code = 'dpad_left_was_released()'; + code = 'dpadLeftWasReleased()'; break; case 'DpadRight': code = 'dpad_right'; break; case 'DpadRightWasPressed': - code = 'dpad_right_was_pressed()'; + code = 'dpadRightWasPressed()'; break; case 'DpadRightWasReleased': - code = 'dpad_right_was_released()'; + code = 'dpadRightWasReleased()'; break; case 'DpadUp': code = 'dpad_up'; break; case 'DpadUpWasPressed': - code = 'dpad_up_was_pressed()'; + code = 'dpadUpWasPressed()'; break; case 'DpadUpWasReleased': - code = 'dpad_up_was_released()'; + code = 'dpadUpWasReleased()'; break; case 'Guide': code = 'guide'; break; case 'GuideWasPressed': - code = 'guide_was_pressed()'; + code = 'guideWasPressed()'; break; case 'GuideWasReleased': - code = 'guide_was_released()'; + code = 'guideWasReleased()'; break; case 'LeftBumper': code = 'left_bumper'; break; case 'LeftBumperWasPressed': - code = 'left_bumper_was_pressed()'; + code = 'leftBumperWasPressed()'; break; case 'LeftBumperWasReleased': - code = 'left_bumper_was_released()'; + code = 'leftBumperWasReleased()'; break; case 'LeftStickButton': code = 'left_stick_button'; break; case 'LeftStickButtonWasPressed': - code = 'left_stick_button_was_pressed()'; + code = 'leftStickButtonWasPressed()'; break; case 'LeftStickButtonWasReleased': - code = 'left_stick_button_was_released()'; + code = 'leftStickButtonWasReleased()'; break; case 'LeftStickX': code = 'left_stick_x'; break; - case 'LeftStickXWasPressed': - code = 'left_stick_x_was_pressed()'; - break; - case 'LeftStickXWasReleased': - code = 'left_stick_x_was_released()'; - break; case 'LeftStickY': code = 'left_stick_y'; break; - case 'LeftStickYWasPressed': - code = 'left_stick_y_was_pressed()'; - break; - case 'LeftStickYWasReleased': - code = 'left_stick_y_was_released()'; - break; case 'LeftTrigger': code = 'left_trigger'; break; + case 'LeftTriggerPressed': + code = 'left_trigger_pressed'; + break; case 'LeftTriggerWasPressed': - code = 'left_trigger_was_pressed()'; + code = 'leftTriggerWasPressed()'; break; case 'LeftTriggerWasReleased': - code = 'left_trigger_was_released()'; + code = 'leftTriggerWasReleased()'; break; case 'Options': code = 'options'; break; case 'OptionsWasPressed': - code = 'options_was_pressed()'; + code = 'optionsWasPressed()'; break; case 'OptionsWasReleased': - code = 'options_was_released()'; + code = 'optionsWasReleased()'; break; case 'PS': code = 'ps'; break; case 'PSWasPressed': - code = 'ps_was_pressed()'; + code = 'psWasPressed()'; break; case 'PSWasReleased': - code = 'ps_was_released()'; + code = 'psWasReleased()'; break; case 'RightBumper': code = 'right_bumper'; break; case 'RightBumperWasPressed': - code = 'right_bumper_was_pressed()'; + code = 'rightBumperWasPressed()'; break; case 'RightBumperWasReleased': - code = 'right_bumper_was_released()'; + code = 'rightBumperWasReleased()'; break; case 'RightStickButton': code = 'right_stick_button'; break; case 'RightStickButtonWasPressed': - code = 'right_stick_button_was_pressed()'; + code = 'rightStickButtonWasPressed()'; break; case 'RightStickButtonWasReleased': - code = 'right_stick_button_was_released()'; + code = 'rightStickButtonWasReleased()'; break; case 'RightStickX': code = 'right_stick_x'; break; - case 'RightStickXWasPressed': - code = 'right_stick_x_was_pressed()'; - break; - case 'RightStickXWasReleased': - code = 'right_stick_x_was_released()'; - break; case 'RightStickY': code = 'right_stick_y'; break; - case 'RightStickYWasPressed': - code = 'right_stick_y_was_pressed()'; - break; - case 'RightStickYWasReleased': - code = 'right_stick_y_was_released()'; - break; case 'RightTrigger': code = 'right_trigger'; break; + case 'RightTriggerPressed': + code = 'right_trigger_pressed'; + break; case 'RightTriggerWasPressed': - code = 'right_trigger_was_pressed()'; + code = 'rightTriggerWasPressed()'; break; case 'RightTriggerWasReleased': - code = 'right_trigger_was_released()'; + code = 'rightTriggerWasReleased()'; break; case 'Share': code = 'share'; break; case 'ShareWasPressed': - code = 'share_was_pressed()'; + code = 'shareWasPressed()'; break; case 'ShareWasReleased': - code = 'share_was_released()'; + code = 'shareWasReleased()'; break; case 'Square': code = 'square'; break; case 'SquareWasPressed': - code = 'square_was_pressed()'; + code = 'squareWasPressed()'; break; case 'SquareWasReleased': - code = 'square_was_released()'; + code = 'squareWasReleased()'; break; case 'Start': code = 'start'; break; case 'StartWasPressed': - code = 'start_was_pressed()'; + code = 'startWasPressed()'; break; case 'StartWasReleased': - code = 'start_was_released()'; + code = 'startWasReleased()'; break; case 'Touchpad': code = 'touchpad'; break; case 'TouchpadWasPressed': - code = 'touchpad_was_pressed()'; + code = 'touchpadWasPressed()'; break; case 'TouchpadWasReleased': - code = 'touchpad_was_released()'; + code = 'touchpadWasReleased()'; break; case 'TouchpadFinger1': code = 'touchpad_finger_1'; @@ -496,28 +493,31 @@ Blockly.FtcJava['gamepad_getProperty'] = function(block) { code = 'triangle'; break; case 'TriangleWasPressed': - code = 'triangle_was_pressed()'; + code = 'triangleWasPressed()'; break; case 'TriangleWasReleased': - code = 'triangle_was_released()'; + code = 'triangleWasReleased()'; + break; + case 'TriggerThreshold': + code = 'getTriggerThreshold()'; break; case 'X': code = 'x'; break; case 'XWasPressed': - code = 'x_was_pressed()'; + code = 'xWasPressed()'; break; case 'XWasReleased': - code = 'x_was_released()'; + code = 'xWasReleased()'; break; case 'Y': code = 'y'; break; case 'YWasPressed': - code = 'y_was_pressed()'; + code = 'yWasPressed()'; break; case 'YWasReleased': - code = 'y_was_released()'; + code = 'yWasReleased()'; break; default: throw 'Unexpected property ' + property + ' (gamepad_getProperty).'; @@ -569,6 +569,9 @@ Blockly.Blocks['gamepad_getProperty_Boolean'] = { ['LeftStickButton', 'LeftStickButton'], ['LeftStickButtonWasPressed', 'LeftStickButtonWasPressed'], ['LeftStickButtonWasReleased', 'LeftStickButtonWasReleased'], + ['LeftTriggerPressed', 'LeftTriggerPressed'], + ['LeftTriggerWasPressed', 'LeftTriggerWasPressed'], + ['LeftTriggerWasReleased', 'LeftTriggerWasReleased'], ['Options', 'Options'], ['OptionsWasPressed', 'OptionsWasPressed'], ['OptionsWasReleased', 'OptionsWasReleased'], @@ -581,6 +584,9 @@ Blockly.Blocks['gamepad_getProperty_Boolean'] = { ['RightStickButton', 'RightStickButton'], ['RightStickButtonWasPressed', 'RightStickButtonWasPressed'], ['RightStickButtonWasReleased', 'RightStickButtonWasReleased'], + ['RightTriggerPressed', 'RightTriggerPressed'], + ['RightTriggerWasPressed', 'RightTriggerWasPressed'], + ['RightTriggerWasReleased', 'RightTriggerWasReleased'], ['Share', 'Share'], ['ShareWasPressed', 'ShareWasPressed'], ['ShareWasReleased', 'ShareWasReleased'], @@ -654,6 +660,9 @@ Blockly.Blocks['gamepad_getProperty_Boolean'] = { ['LeftStickButton', 'Returns true if the left stick button is pressed.'], ['LeftStickButtonWasPressed', 'Returns true if the left stick button was pressed since the last call of this block.'], ['LeftStickButtonWasReleased', 'Returns true if the left stick button was released since the last call of this block.'], + ['LeftTriggerPressed', 'Returns true if the left trigger is past the trigger threshold.'], + ['LeftTriggerWasPressed', 'Returns true if the left trigger was pressed since the last call of this block.'], + ['LeftTriggerWasReleased', 'Returns true if the left trigger was released since the last call of this block.'], ['Options', 'Returns true if the Options button is pressed.'], ['OptionsWasPressed', 'Returns true if the Options button was pressed since the last call of this block.'], ['OptionsWasReleased', 'Returns true if the Options button was released since the last call of this block.'], @@ -666,6 +675,9 @@ Blockly.Blocks['gamepad_getProperty_Boolean'] = { ['RightStickButton', 'Returns true if the right stick button is pressed.'], ['RightStickButtonWasPressed', 'Returns true if the right stick button was pressed since the last call of this block.'], ['RightStickButtonWasReleased', 'Returns true if the right stick button was released since the last call of this block.'], + ['RightTriggerPressed', 'Returns true if the right trigger is past the trigger threshold.'], + ['RightTriggerWasPressed', 'Returns true if the right trigger was pressed since the last call of this block.'], + ['RightTriggerWasReleased', 'Returns true if the right trigger was released since the last call of this block.'], ['Share', 'Returns true if the Share button is pressed.'], ['ShareWasPressed', 'Returns true if the Share button was pressed since the last call of this block.'], ['ShareWasReleased', 'Returns true if the Share button was released since the last call of this block.'], @@ -722,6 +734,7 @@ Blockly.Blocks['gamepad_getProperty_Number'] = { ['TouchpadFinger1Y', 'TouchpadFinger1Y'], ['TouchpadFinger2X', 'TouchpadFinger2X'], ['TouchpadFinger2Y', 'TouchpadFinger2Y'], + ['TriggerThreshold', 'TriggerThreshold'], ]; this.setOutput(true, 'Number'); this.appendDummyInput() @@ -738,10 +751,11 @@ Blockly.Blocks['gamepad_getProperty_Number'] = { ['RightStickX', 'Returns a numeric value between -1.0 and +1.0 representing the right analog stick horizontal axis value.'], ['RightStickY', 'Returns a numeric value between -1.0 and +1.0 representing the right analog stick vertical axis value .'], ['RightTrigger', 'Returns a numeric value between 0.0 and +1.0 representing the right trigger value.'], - ['TouchpadFinger1X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], - ['TouchpadFinger1Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], - ['TouchpadFinger2X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], - ['TouchpadFinger2Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], + ['TouchpadFinger1X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], + ['TouchpadFinger1Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], + ['TouchpadFinger2X', 'Returns a numeric value between -1.0 and +1.0 representing the horizontal axis value.'], + ['TouchpadFinger2Y', 'Returns a numeric value between -1.0 and +1.0 representing the vertical axis value.'], + ['TriggerThreshold', 'Returns the threshold for determining if a trigger is pressed.'], ]; this.setTooltip(function() { var key = thisBlock.getFieldValue('PROP'); @@ -765,6 +779,7 @@ Blockly.Blocks['gamepad_getProperty_Number'] = { case 'TouchpadFinger1Y': case 'TouchpadFinger2X': case 'TouchpadFinger2Y': + case 'TriggerThreshold': return 'float'; default: throw 'Unexpected property ' + property + ' (gamepad_getProperty_Number getOutputType).'; @@ -779,6 +794,64 @@ Blockly.JavaScript['gamepad_getProperty_Number'] = Blockly.FtcJava['gamepad_getProperty_Number'] = Blockly.FtcJava['gamepad_getProperty']; +Blockly.Blocks['gamepad_setProperty_Number'] = { + init: function() { + var PROPERTY_CHOICES = [ + ['TriggerThreshold', 'TriggerThreshold'], + ]; + this.appendValueInput('VALUE').setCheck('Number') + .appendField('set') + .appendField(createGamepadDropdown(), 'IDENTIFIER') + .appendField('.') + .appendField(new Blockly.FieldDropdown(PROPERTY_CHOICES), 'PROP') + .appendField('to'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(setPropertyColor); + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + var TOOLTIPS = [ + ['TriggerThreshold', 'Sets the threshold for determining if a trigger is pressed.'], + ]; + this.setTooltip(function() { + var key = thisBlock.getFieldValue('PROP'); + for (var i = 0; i < TOOLTIPS.length; i++) { + if (TOOLTIPS[i][0] == key) { + return TOOLTIPS[i][1]; + } + } + return ''; + }); + this.getFtcJavaInputType = function(inputName) { + if (inputName == 'VALUE') { + var property = thisBlock.getFieldValue('PROP'); + switch (property) { + case 'TriggerThreshold': + return 'float'; + default: + throw 'Unexpected property ' + property + ' (gamepad_setProperty_Number getArgumentType).'; + } + } + return ''; + }; + } +}; + +Blockly.JavaScript['gamepad_setProperty_Number'] = function(block) { + var identifier = block.getFieldValue('IDENTIFIER'); + var property = block.getFieldValue('PROP'); + var value = Blockly.JavaScript.valueToCode( + block, 'VALUE', Blockly.JavaScript.ORDER_NONE); + return identifier + '.set' + property + '(' + value + ');\n'; +}; + +Blockly.FtcJava['gamepad_setProperty_Number'] = function(block) { + var property = block.getFieldValue('PROP'); + var identifier = Blockly.FtcJava.importDeclareAssign_(block, 'IDENTIFIER', 'DcMotor'); + var value = Blockly.FtcJava.valueToCode(block, 'VALUE', Blockly.FtcJava.ORDER_NONE); + return identifier + '.set' + property + '(' + value + ');\n'; +}; + Blockly.Blocks['gamepad_rumble_with1'] = { init: function() { this.appendDummyInput() diff --git a/Blocks/src/main/assets/blocks/gobilda_pinpoint.js b/Blocks/src/main/assets/blocks/gobilda_pinpoint.js index 14e9cb8f..970566f7 100644 --- a/Blocks/src/main/assets/blocks/gobilda_pinpoint.js +++ b/Blocks/src/main/assets/blocks/gobilda_pinpoint.js @@ -205,6 +205,145 @@ Blockly.FtcJava['goBildaPinpoint_typedEnum_readData'] = function(block) { return [code, Blockly.FtcJava.ORDER_MEMBER]; }; +Blockly.Blocks['goBildaPinpoint_typedEnum_errorDetectionType'] = { + init: function() { + var ERROR_DETECTION_TYPE_CHOICES = [ + ['NONE', 'NONE'], + ['CRC', 'CRC'], + ['LOCAL_TEST', 'LOCAL_TEST'], + ]; + this.setOutput(true, 'GoBildaPinpointDriver.ErrorDetectionType'); + this.appendDummyInput() + .appendField(createNonEditableField('ErrorDetectionType')) + .appendField('.') + .appendField(new Blockly.FieldDropdown(ERROR_DETECTION_TYPE_CHOICES), 'ERROR_DETECTION_TYPE'); + this.setColour(getPropertyColor); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + var TOOLTIPS = [ + ['NONE', + 'The GoBildaPinpointDriver.ErrorDetectionType value NONE. ' + + 'Does not check the data and passes it directly to the user.'], + ['CRC', + 'The GoBildaPinpointDriver.ErrorDetectionType value CRC. ' + + 'Uses CRC8 error detection to catch incorrect reads. Only supported by devices with ' + + 'V3 firmware or newer.'], + ['LOCAL_TEST', + 'The GoBildaPinpointDriver.ErrorDetectionType value LOCAL_TEST. ' + + 'Uses "Controller only" validation to ensure that the data is !NAN, is not all zeros, ' + + 'and is a reasonable number. This is faster than CRC but may not catch every ' + + 'erroneous read.'], + ]; + this.setTooltip(function() { + var key = thisBlock.getFieldValue('ERROR_DETECTION_TYPE'); + for (var i = 0; i < TOOLTIPS.length; i++) { + if (TOOLTIPS[i][0] == key) { + return TOOLTIPS[i][1]; + } + } + return ''; + }); + } +}; + +Blockly.JavaScript['goBildaPinpoint_typedEnum_errorDetectionType'] = function(block) { + var code = '"' + block.getFieldValue('ERROR_DETECTION_TYPE') + '"'; + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.FtcJava['goBildaPinpoint_typedEnum_errorDetectionType'] = function(block) { + var code = 'GoBildaPinpointDriver.ErrorDetectionType.' + block.getFieldValue('ERROR_DETECTION_TYPE'); + Blockly.FtcJava.generateImport_('GoBildaPinpointDriver'); + return [code, Blockly.FtcJava.ORDER_MEMBER]; +}; + +Blockly.Blocks['goBildaPinpoint_typedEnum_register'] = { + init: function() { + var REGISTER_CHOICES = [ + ['DEVICE_ID', 'DEVICE_ID'], + ['DEVICE_VERSION', 'DEVICE_VERSION'], + ['DEVICE_STATUS', 'DEVICE_STATUS'], + ['DEVICE_CONTROL', 'DEVICE_CONTROL'], + ['LOOP_TIME', 'LOOP_TIME'], + ['X_ENCODER_VALUE', 'X_ENCODER_VALUE'], + ['Y_ENCODER_VALUE', 'Y_ENCODER_VALUE'], + ['X_POSITION', 'X_POSITION'], + ['Y_POSITION', 'Y_POSITION'], + ['H_ORIENTATION', 'H_ORIENTATION'], + ['X_VELOCITY', 'X_VELOCITY'], + ['Y_VELOCITY', 'Y_VELOCITY'], + ['H_VELOCITY', 'H_VELOCITY'], + ['MM_PER_TICK', 'MM_PER_TICK'], + ['X_POD_OFFSET', 'X_POD_OFFSET'], + ['Y_POD_OFFSET', 'Y_POD_OFFSET'], + ['YAW_SCALAR', 'YAW_SCALAR'], + ['BULK_READ', 'BULK_READ'], + ['QUATERNION_W', 'QUATERNION_W'], + ['QUATERNION_X', 'QUATERNION_X'], + ['QUATERNION_Y', 'QUATERNION_Y'], + ['QUATERNION_Z', 'QUATERNION_Z'], + ['PITCH', 'PITCH'], + ['ROLL', 'ROLL'], + ['SET_BULK_READ', 'SET_BULK_READ'], + ]; + this.setOutput(true, 'GoBildaPinpointDriver.Register'); + this.appendDummyInput() + .appendField(createNonEditableField('Register')) + .appendField('.') + .appendField(new Blockly.FieldDropdown(REGISTER_CHOICES), 'REGISTER'); + this.setColour(getPropertyColor); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + var TOOLTIPS = [ + ['DEVICE_ID', 'The GoBildaPinpointDriver.Register value DEVICE_ID'], + ['DEVICE_VERSION', 'The GoBildaPinpointDriver.Register value DEVICE_VERSION'], + ['DEVICE_STATUS', 'The GoBildaPinpointDriver.Register value DEVICE_STATUS'], + ['DEVICE_CONTROL', 'The GoBildaPinpointDriver.Register value DEVICE_CONTROL'], + ['LOOP_TIME', 'The GoBildaPinpointDriver.Register value LOOP_TIME'], + ['X_ENCODER_VALUE', 'The GoBildaPinpointDriver.Register value X_ENCODER_VALUE'], + ['Y_ENCODER_VALUE', 'The GoBildaPinpointDriver.Register value Y_ENCODER_VALUE'], + ['X_POSITION', 'The GoBildaPinpointDriver.Register value X_POSITION'], + ['Y_POSITION', 'The GoBildaPinpointDriver.Register value Y_POSITION'], + ['H_ORIENTATION', 'The GoBildaPinpointDriver.Register value H_ORIENTATION'], + ['X_VELOCITY', 'The GoBildaPinpointDriver.Register value X_VELOCITY'], + ['Y_VELOCITY', 'The GoBildaPinpointDriver.Register value Y_VELOCITY'], + ['H_VELOCITY', 'The GoBildaPinpointDriver.Register value H_VELOCITY'], + ['MM_PER_TICK', 'The GoBildaPinpointDriver.Register value MM_PER_TICK'], + ['X_POD_OFFSET', 'The GoBildaPinpointDriver.Register value X_POD_OFFSET'], + ['Y_POD_OFFSET', 'The GoBildaPinpointDriver.Register value Y_POD_OFFSET'], + ['YAW_SCALAR', 'The GoBildaPinpointDriver.Register value YAW_SCALAR'], + ['BULK_READ', 'The GoBildaPinpointDriver.Register value BULK_READ'], + ['QUATERNION_W', 'The GoBildaPinpointDriver.Register value QUATERNION_W'], + ['QUATERNION_X', 'The GoBildaPinpointDriver.Register value QUATERNION_X'], + ['QUATERNION_Y', 'The GoBildaPinpointDriver.Register value QUATERNION_Y'], + ['QUATERNION_Z', 'The GoBildaPinpointDriver.Register value QUATERNION_Z'], + ['PITCH', 'The GoBildaPinpointDriver.Register value PITCH'], + ['ROLL', 'The GoBildaPinpointDriver.Register value ROLL'], + ['SET_BULK_READ', 'The GoBildaPinpointDriver.Register value SET_BULK_READ'], + ]; + this.setTooltip(function() { + var key = thisBlock.getFieldValue('REGISTER'); + for (var i = 0; i < TOOLTIPS.length; i++) { + if (TOOLTIPS[i][0] == key) { + return TOOLTIPS[i][1]; + } + } + return ''; + }); + } +}; + +Blockly.JavaScript['goBildaPinpoint_typedEnum_register'] = function(block) { + var code = '"' + block.getFieldValue('REGISTER') + '"'; + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.FtcJava['goBildaPinpoint_typedEnum_register'] = function(block) { + var code = 'GoBildaPinpointDriver.Register.' + block.getFieldValue('REGISTER'); + Blockly.FtcJava.generateImport_('GoBildaPinpointDriver'); + return [code, Blockly.FtcJava.ORDER_MEMBER]; +}; + // Properties Blockly.Blocks['goBildaPinpoint_setProperty_Number'] = { @@ -422,6 +561,38 @@ Blockly.JavaScript['goBildaPinpoint_getProperty_Pose2D'] = Blockly.JavaScript['g Blockly.FtcJava['goBildaPinpoint_getProperty_Pose2D'] = Blockly.FtcJava['goBildaPinpoint_getProperty_Number']; +Blockly.Blocks['goBildaPinpoint_getProperty_Quaternion'] = { + init: function() { + var PROPERTY_CHOICES = [ + ['Quaternion', 'Quaternion'], + ]; + this.setOutput(true, 'Quaternion'); + this.appendDummyInput() + .appendField(createGoBildaPinpointDropdown(), 'IDENTIFIER') + .appendField('.') + .appendField(new Blockly.FieldDropdown(PROPERTY_CHOICES), 'PROP'); + this.setColour(getPropertyColor); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + var TOOLTIPS = [ + ['Quaternion', 'Returns a Quaternion which describes the 3d orientation of the device.'], + ]; + this.setTooltip(function() { + var key = thisBlock.getFieldValue('PROP'); + for (var i = 0; i < TOOLTIPS.length; i++) { + if (TOOLTIPS[i][0] == key) { + return TOOLTIPS[i][1]; + } + } + return ''; + }); + } +}; + +Blockly.JavaScript['goBildaPinpoint_getProperty_Quaternion'] = Blockly.JavaScript['goBildaPinpoint_getProperty_Number']; + +Blockly.FtcJava['goBildaPinpoint_getProperty_Quaternion'] = Blockly.FtcJava['goBildaPinpoint_getProperty_Number']; + // Functions Blockly.Blocks['goBildaPinpoint_update'] = { @@ -1219,3 +1390,249 @@ Blockly.FtcJava['goBildaPinpoint_getYOffset'] = function(block) { var code = identifier + '.getYOffset(' + distanceUnit + ')'; return [code, Blockly.FtcJava.ORDER_FUNCTION_CALL]; }; + +Blockly.Blocks['goBildaPinpoint_setBulkReadScope'] = { + init: function() { + this.appendDummyInput() + .appendField('call') + .appendField(createGoBildaPinpointDropdown(), 'IDENTIFIER') + .appendField('.') + .appendField(createNonEditableField('setBulkReadScope')); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(functionColor); + this.setTooltip( + 'Configures the registers that are read in bulk when update is called. Use this to ' + + 'minimize read times based on your unique application. Note that this is only supported ' + + 'on V3 firmware and above.'); + this.itemCount_ = 3; + this.updateShape_(); + this.setMutator(new Blockly.Mutator(['goBildaPinpoint_setBulkReadScope_item'])); + }, + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + domToMutation: function(xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + decompose: function(workspace) { + var containerBlock = workspace.newBlock('goBildaPinpoint_setBulkReadScope_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('goBildaPinpoint_setBulkReadScope_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + compose: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (itemBlock) { + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.itemCount_; i++) { + var connection = this.getInput('REGISTER' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } + this.itemCount_ = connections.length; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.itemCount_; i++) { + Blockly.Mutator.reconnect(connections[i], this, 'REGISTER' + i); + } + }, + saveConnections: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('REGISTER' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + updateShape_: function() { + // Add new inputs. + for (var i = 0; i < this.itemCount_; i++) { + if (!this.getInput('REGISTER' + i)) { + var input = this.appendValueInput('REGISTER' + i); + } + } + // Remove deleted inputs. + while (this.getInput('REGISTER' + i)) { + this.removeInput('REGISTER' + i); + i++; + } + } +}; + +Blockly.Blocks['goBildaPinpoint_setBulkReadScope_container'] = { + /** + * Mutator block for list container. + * @this Blockly.Block + */ + init: function() { + this.setStyle('list_blocks'); + this.appendDummyInput() + .appendField(''); + this.appendStatementInput('STACK'); + this.setTooltip('Add, remove, or reorder registers.'); + this.contextMenu = false; + } +}; + +Blockly.Blocks['goBildaPinpoint_setBulkReadScope_item'] = { + /** + * Mutator block for adding items. + * @this Blockly.Block + */ + init: function() { + this.setStyle('list_blocks'); + this.appendDummyInput() + .appendField('register'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip('Add a register.'); + this.contextMenu = false; + } +}; + +Blockly.JavaScript['goBildaPinpoint_setBulkReadScope'] = function(block) { + var identifier = block.getFieldValue('IDENTIFIER'); + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.JavaScript.valueToCode(block, 'REGISTER' + i, + Blockly.JavaScript.ORDER_COMMA) || 'null'; + } + var registers = '[' + elements.join(', ') + ']'; + return identifier + '.setBulkReadScope(JSON.stringify(' + registers + '));\n'; +}; + +Blockly.FtcJava['goBildaPinpoint_setBulkReadScope'] = function(block) { + var identifier = Blockly.FtcJava.importDeclareAssign_(block, 'IDENTIFIER', 'GoBildaPinpointDriver'); + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.FtcJava.valueToCode(block, 'REGISTER' + i, + Blockly.FtcJava.ORDER_COMMA) || 'null'; + } + var registers = elements.join(',\n' + Blockly.FtcJava.INDENT_CONTINUE); + return identifier + '.setBulkReadScope(\n' + + Blockly.FtcJava.INDENT_CONTINUE + registers + ');\n'; +}; + +Blockly.Blocks['goBildaPinpoint_setErrorDetectionType'] = { + init: function() { + this.appendDummyInput() + .appendField('call') + .appendField(createGoBildaPinpointDropdown(), 'IDENTIFIER') + .appendField('.') + .appendField(createNonEditableField('setErrorDetectionType')); + this.appendValueInput('ERROR_DETECTION_TYPE').setCheck('GoBildaPinpointDriver.ErrorDetectionType') + .appendField('errorDetectionType') + .setAlign(Blockly.ALIGN_RIGHT); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setColour(functionColor); + this.setTooltip('Sets the kind of error correction used on the I²C communication from the device.'); + } +}; + +Blockly.JavaScript['goBildaPinpoint_setErrorDetectionType'] = function(block) { + var identifier = block.getFieldValue('IDENTIFIER'); + var errorDetectionType = Blockly.JavaScript.valueToCode( + block, 'ERROR_DETECTION_TYPE', Blockly.JavaScript.ORDER_NONE); + return identifier + '.setErrorDetectionType(' + errorDetectionType + ');\n'; +}; + +Blockly.FtcJava['goBildaPinpoint_setErrorDetectionType'] = function(block) { + var identifier = Blockly.FtcJava.importDeclareAssign_(block, 'IDENTIFIER', 'GoBildaPinpointDriver'); + var errorDetectionType = Blockly.FtcJava.valueToCode( + block, 'ERROR_DETECTION_TYPE', Blockly.FtcJava.ORDER_NONE); + return identifier + '.setErrorDetectionType(' + errorDetectionType + ');\n'; +}; + +Blockly.Blocks['goBildaPinpoint_getPitch'] = { + init: function() { + this.setOutput(true, 'Number'); + this.appendDummyInput() + .appendField('call') + .appendField(createGoBildaPinpointDropdown(), 'IDENTIFIER') + .appendField('.') + .appendField(createNonEditableField('getPitch')); + this.appendValueInput('ANGLE_UNIT').setCheck('AngleUnit') + .appendField('angleUnit') + .setAlign(Blockly.ALIGN_RIGHT); + this.setColour(functionColor); + this.setTooltip( + 'Returns the current pitch of the device in the specified AngleUnit.'); + this.getFtcJavaOutputType = function() { + return 'double'; + }; + } +}; + +Blockly.JavaScript['goBildaPinpoint_getPitch'] = function(block) { + var identifier = block.getFieldValue('IDENTIFIER'); + var angleUnit = Blockly.JavaScript.valueToCode( + block, 'ANGLE_UNIT', Blockly.JavaScript.ORDER_NONE); + var code = identifier + '.getPitch(' + angleUnit + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.FtcJava['goBildaPinpoint_getPitch'] = function(block) { + var identifier = Blockly.FtcJava.importDeclareAssign_(block, 'IDENTIFIER', 'GoBildaPinpointDriver'); + var angleUnit = Blockly.FtcJava.valueToCode( + block, 'ANGLE_UNIT', Blockly.FtcJava.ORDER_NONE); + var code = identifier + '.getPitch(' + angleUnit + ')'; + return [code, Blockly.FtcJava.ORDER_FUNCTION_CALL]; +}; + +Blockly.Blocks['goBildaPinpoint_getRoll'] = { + init: function() { + this.setOutput(true, 'Number'); + this.appendDummyInput() + .appendField('call') + .appendField(createGoBildaPinpointDropdown(), 'IDENTIFIER') + .appendField('.') + .appendField(createNonEditableField('getRoll')); + this.appendValueInput('ANGLE_UNIT').setCheck('AngleUnit') + .appendField('angleUnit') + .setAlign(Blockly.ALIGN_RIGHT); + this.setColour(functionColor); + this.setTooltip( + 'Returns the current roll of the device in the specified AngleUnit.'); + this.getFtcJavaOutputType = function() { + return 'double'; + }; + } +}; + +Blockly.JavaScript['goBildaPinpoint_getRoll'] = function(block) { + var identifier = block.getFieldValue('IDENTIFIER'); + var angleUnit = Blockly.JavaScript.valueToCode( + block, 'ANGLE_UNIT', Blockly.JavaScript.ORDER_NONE); + var code = identifier + '.getRoll(' + angleUnit + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.FtcJava['goBildaPinpoint_getRoll'] = function(block) { + var identifier = Blockly.FtcJava.importDeclareAssign_(block, 'IDENTIFIER', 'GoBildaPinpointDriver'); + var angleUnit = Blockly.FtcJava.valueToCode( + block, 'ANGLE_UNIT', Blockly.FtcJava.ORDER_NONE); + var code = identifier + '.getRoll(' + angleUnit + ')'; + return [code, Blockly.FtcJava.ORDER_FUNCTION_CALL]; +}; diff --git a/Blocks/src/main/assets/blocks/samples/ConceptGamepadEdgeDetection.blk b/Blocks/src/main/assets/blocks/samples/ConceptGamepadEdgeDetection.blk index 8972d1b5..1d386c28 100644 --- a/Blocks/src/main/assets/blocks/samples/ConceptGamepadEdgeDetection.blk +++ b/Blocks/src/main/assets/blocks/samples/ConceptGamepadEdgeDetection.blk @@ -171,6 +171,134 @@ There are two main types of edge detection. Rising edge detection will trigger w + +Add an empty line to separate the buttons in telemetry + + + + + + + + + +Add the status of the Gamepad 1 Left trigger + + + + +Gamepad 1 Left Trigger Pressed + + + + +text + + +gamepad1 +LeftTriggerWasPressed +{"IDENTIFIER":"gamepad1"} + + + + + + +Gamepad 1 Left Trigger Released + + + + +text + + +gamepad1 +LeftTriggerWasReleased +{"IDENTIFIER":"gamepad1"} + + + + + + +Gamepad 1 Left Trigger Status + + + + +text + + +gamepad1 +LeftTriggerPressed +{"IDENTIFIER":"gamepad1"} + + + + +Add an empty line to separate the buttons in telemetry + + + + + + + + + +Add the status of the Gamepad 1 Right trigger + + + + +Gamepad 1 Right Trigger Pressed + + + + +text + + +gamepad1 +RightTriggerWasPressed +{"IDENTIFIER":"gamepad1"} + + + + + + +Gamepad 1 Right Trigger Released + + + + +text + + +gamepad1 +RightTriggerWasReleased +{"IDENTIFIER":"gamepad1"} + + + + + + +Gamepad 1 Right Trigger Status + + + + +text + + +gamepad1 +RightTriggerPressed +{"IDENTIFIER":"gamepad1"} + + + Add a note that the telemetry is only updated every 2 seconds @@ -220,6 +348,30 @@ There are two main types of edge detection. Rising edge detection will trigger w + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Blocks/src/main/assets/toolbox/gamepad.xml b/Blocks/src/main/assets/toolbox/gamepad.xml index e08ce403..7363bfa8 100644 --- a/Blocks/src/main/assets/toolbox/gamepad.xml +++ b/Blocks/src/main/assets/toolbox/gamepad.xml @@ -63,6 +63,10 @@ gamepad1 LeftTrigger + + gamepad1 + LeftTriggerPressed + gamepad1 Options @@ -91,6 +95,10 @@ gamepad1 RightTrigger + + gamepad1 + RightTriggerPressed + gamepad1 Share @@ -135,6 +143,15 @@ gamepad1 Triangle + + gamepad1 + TriggerThreshold + + + gamepad1 + TriggerThreshold + 0.5 + gamepad1 X @@ -192,6 +209,10 @@ gamepad1 LeftStickButtonWasPressed + + gamepad1 + LeftTriggerWasPressed + gamepad1 OptionsWasPressed @@ -208,6 +229,10 @@ gamepad1 RightStickButtonWasPressed + + gamepad1 + RightTriggerWasPressed + gamepad1 ShareWasPressed @@ -289,6 +314,10 @@ gamepad1 LeftStickButtonWasReleased + + gamepad1 + LeftTriggerWasReleased + gamepad1 OptionsWasReleased @@ -305,6 +334,10 @@ gamepad1 RightStickButtonWasReleased + + gamepad1 + RightTriggerWasReleased + gamepad1 ShareWasReleased diff --git a/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/hardware/HardwareUtil.java b/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/hardware/HardwareUtil.java index 69f9aa2b..bb709ac6 100644 --- a/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/hardware/HardwareUtil.java +++ b/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/hardware/HardwareUtil.java @@ -1451,6 +1451,16 @@ private static void processMethodArguments(StringBuilder xmlToolbox, Class[] par shadow = (defaultValue == null) ? ToolboxUtil.makeTypedEnumShadow("goBildaPinpoint", "readData") : ToolboxUtil.makeTypedEnumShadow("goBildaPinpoint", "readData", "READ_DATA", defaultValue); + } else if (argType.equals(GoBildaPinpointDriver.ErrorDetectionType.class.getName())) { + String defaultValue = parseEnumDefaultValue(parameterDefaultValues[i], GoBildaPinpointDriver.ErrorDetectionType.class); + shadow = (defaultValue == null) + ? ToolboxUtil.makeTypedEnumShadow("goBildaPinpoint", "errorDetectionType") + : ToolboxUtil.makeTypedEnumShadow("goBildaPinpoint", "errorDetectionType", "ERROR_DETECTION_TYPE", defaultValue); + } else if (argType.equals(GoBildaPinpointDriver.Register.class.getName())) { + String defaultValue = parseEnumDefaultValue(parameterDefaultValues[i], GoBildaPinpointDriver.Register.class); + shadow = (defaultValue == null) + ? ToolboxUtil.makeTypedEnumShadow("goBildaPinpoint", "register") + : ToolboxUtil.makeTypedEnumShadow("goBildaPinpoint", "register", "REGISTER", defaultValue); } else if (argType.equals(HuskyLens.Algorithm.class.getName())) { String defaultValue = parseEnumDefaultValue(parameterDefaultValues[i], HuskyLens.Algorithm.class); shadow = (defaultValue == null) @@ -2540,6 +2550,7 @@ private static void addGoBildaPinpointCategoryToToolbox( String identifier = hardwareItems.get(0).identifier; String zero = ToolboxUtil.makeNumberShadow(0); String encoderDirection = ToolboxUtil.makeTypedEnumShadow(hardwareType, "encoderDirection"); + String errorDetectionType = ToolboxUtil.makeTypedEnumShadow(hardwareType, "errorDetectionType"); String readData = ToolboxUtil.makeTypedEnumShadow(hardwareType, "readData"); String goBildaOdometryPods = ToolboxUtil.makeTypedEnumShadow(hardwareType, "goBildaOdometryPods"); String distanceUnit = ToolboxUtil.makeTypedEnumShadow("navigation", "distanceUnit"); @@ -2558,6 +2569,7 @@ private static void addGoBildaPinpointCategoryToToolbox( properties.put("Frequency", "Number"); properties.put("DeviceStatus", "DeviceStatus"); properties.put("Position", "Pose2D"); + properties.put("Quaternion", "Quaternion"); Map setterValues = new HashMap(); setterValues.put("YawScalar", new String[] { zero }); Map enumBlocks = new HashMap(); @@ -2634,7 +2646,42 @@ private static void addGoBildaPinpointCategoryToToolbox( Map getYOffsetArgs = new LinkedHashMap(); getYOffsetArgs.put("DISTANCE_UNIT", distanceUnit); functions.put("getYOffset", getYOffsetArgs); + Map setErrorDetectionTypeArgs = new LinkedHashMap(); + setErrorDetectionTypeArgs.put("ERROR_DETECTION_TYPE", errorDetectionType); + functions.put("setErrorDetectionType", setErrorDetectionTypeArgs); + Map getPitchArgs = new LinkedHashMap(); + getPitchArgs.put("ANGLE_UNIT", angleUnit); + functions.put("getPitch", getPitchArgs); + Map getRollArgs = new LinkedHashMap(); + getRollArgs.put("ANGLE_UNIT", angleUnit); + functions.put("getRoll", getRollArgs); ToolboxUtil.addFunctions(xmlToolbox, hardwareType, identifier, functions); + + GoBildaPinpointDriver.Register[] bulkReadScopeExample = new GoBildaPinpointDriver.Register[] { + GoBildaPinpointDriver.Register.X_POSITION, + GoBildaPinpointDriver.Register.Y_POSITION, + GoBildaPinpointDriver.Register.H_ORIENTATION, + }; + xmlToolbox + .append("\n") + .append(" \n") + .append(" ").append(identifier).append("\n"); + for (int i = 0; i < bulkReadScopeExample.length; i++) { + xmlToolbox + .append(" \n") + .append(" \n") + .append(" ").append(bulkReadScopeExample[i]).append("\n") + .append(" \n") + .append(" \n"); + } + xmlToolbox + .append("\n"); + for (GoBildaPinpointDriver.Register register : GoBildaPinpointDriver.Register.values()) { + xmlToolbox + .append("\n") + .append(" ").append(register).append("\n") + .append("\n"); + } } /** diff --git a/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GamepadAccess.java b/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GamepadAccess.java index 4ec56ddc..3e2e8111 100644 --- a/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GamepadAccess.java +++ b/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GamepadAccess.java @@ -935,6 +935,60 @@ public float getLeftTrigger() { } } + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, fieldName = "left_trigger_pressed") + public boolean getLeftTriggerPressed() { + try { + startBlockExecution(BlockType.GETTER, ".LeftTriggerPressed"); + if (gamepad != null) { + return gamepad.left_trigger_pressed; + } + return false; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, methodName = "leftTriggerWasPressed") + public boolean getLeftTriggerWasPressed() { + try { + startBlockExecution(BlockType.GETTER, ".LeftTriggerWasPressed"); + if (gamepad != null) { + return gamepad.leftTriggerWasPressed(); + } + return false; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, methodName = "leftTriggerWasReleased") + public boolean getLeftTriggerWasReleased() { + try { + startBlockExecution(BlockType.GETTER, ".LeftTriggerWasReleased"); + if (gamepad != null) { + return gamepad.leftTriggerWasReleased(); + } + return false; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + @SuppressWarnings("unused") @JavascriptInterface @Block(classes = {Gamepad.class}, fieldName = "right_trigger") @@ -953,6 +1007,95 @@ public float getRightTrigger() { } } + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, fieldName = "right_trigger_pressed") + public boolean getRightTriggerPressed() { + try { + startBlockExecution(BlockType.GETTER, ".RightTriggerPressed"); + if (gamepad != null) { + return gamepad.right_trigger_pressed; + } + return false; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, methodName = "rightTriggerWasPressed") + public boolean getRightTriggerWasPressed() { + try { + startBlockExecution(BlockType.GETTER, ".RightTriggerWasPressed"); + if (gamepad != null) { + return gamepad.rightTriggerWasPressed(); + } + return false; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, methodName = "rightTriggerWasReleased") + public boolean getRightTriggerWasReleased() { + try { + startBlockExecution(BlockType.GETTER, ".RightTriggerWasReleased"); + if (gamepad != null) { + return gamepad.rightTriggerWasReleased(); + } + return false; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, methodName = "getTriggerThreshold") + public float getTriggerThreshold() { + try { + startBlockExecution(BlockType.GETTER, ".TriggerThreshold"); + if (gamepad != null) { + return gamepad.getTriggerThreshold(); + } + return 0f; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {Gamepad.class}, methodName = "setTriggerThreshold") + public void setTriggerThreshold(float threshold) { + try { + startBlockExecution(BlockType.SETTER, ".TriggerThreshold"); + if (gamepad != null) { + gamepad.setTriggerThreshold(threshold); + } + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + @SuppressWarnings("unused") @JavascriptInterface @Block(classes = {Gamepad.class}, methodName = "atRest") diff --git a/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GoBildaPinpointAccess.java b/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GoBildaPinpointAccess.java index c6e1ec52..b19b5b21 100644 --- a/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GoBildaPinpointAccess.java +++ b/Blocks/src/main/java/com/google/blocks/ftcrobotcontroller/runtime/GoBildaPinpointAccess.java @@ -21,12 +21,15 @@ import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver; import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver.DeviceStatus; import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver.EncoderDirection; +import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver.ErrorDetectionType; import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver.GoBildaOdometryPods; import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver.ReadData; +import com.qualcomm.hardware.gobilda.GoBildaPinpointDriver.Register; import com.qualcomm.robotcore.hardware.HardwareMap; import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit; import org.firstinspires.ftc.robotcore.external.navigation.Pose2D; +import org.firstinspires.ftc.robotcore.external.navigation.Quaternion; import org.firstinspires.ftc.robotcore.external.navigation.UnnormalizedAngleUnit; /** @@ -54,6 +57,14 @@ private ReadData checkReadData(String readDataString) { return checkArg(readDataString, ReadData.class, "readData"); } + private ErrorDetectionType checkErrorDetectionType(String errorDetectionTypeString) { + return checkArg(errorDetectionTypeString, ErrorDetectionType.class, "errorDetectionType"); + } + + private Register checkRegister(String registerString) { + return checkArg(registerString, Register.class, "register"); + } + @SuppressWarnings("unused") @JavascriptInterface @Block(classes = {GoBildaPinpointDriver.class}, methodName = "setYawScalar") @@ -588,4 +599,95 @@ public float getYOffset(String distanceUnitString) { endBlockExecution(); } } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {GoBildaPinpointDriver.class}, methodName = "setBulkReadScope") + public void setBulkReadScope(String json) { + try { + startBlockExecution(BlockType.GETTER, ".setBulkReadScope"); + String[] registerStrings = fromJson(json, String[].class); + Register[] registers = new Register[registerStrings.length]; + for (int i = 0; i < registers.length; i++) { + registers[i] = checkRegister(registerStrings[i]); + } + goBildaPinpoint.setBulkReadScope(registers); + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {GoBildaPinpointDriver.class}, methodName = "setErrorDetectionType") + public void setErrorDetectionType(String errorDetectionTypeString) { + try { + startBlockExecution(BlockType.FUNCTION, ".setErrorDetectionType"); + ErrorDetectionType errorDetectionType = checkErrorDetectionType(errorDetectionTypeString); + if (errorDetectionType != null) { + goBildaPinpoint.setErrorDetectionType(errorDetectionType); + } + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {GoBildaPinpointDriver.class}, methodName = "getQuaternion") + public Quaternion getQuaternion() { + try { + startBlockExecution(BlockType.GETTER, ".Quaternion"); + return goBildaPinpoint.getQuaternion(); + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {GoBildaPinpointDriver.class}, methodName = "getPitch") + public double getPitch(String angleUnitString) { + try { + startBlockExecution(BlockType.FUNCTION, ".getPitch"); + AngleUnit angleUnit = checkAngleUnit(angleUnitString); + if (angleUnit != null) { + return goBildaPinpoint.getPitch(angleUnit); + } + return 0; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } + + @SuppressWarnings("unused") + @JavascriptInterface + @Block(classes = {GoBildaPinpointDriver.class}, methodName = "getRoll") + public double getRoll(String angleUnitString) { + try { + startBlockExecution(BlockType.FUNCTION, ".getRoll"); + AngleUnit angleUnit = checkAngleUnit(angleUnitString); + if (angleUnit != null) { + return goBildaPinpoint.getRoll(angleUnit); + } + return 0; + } catch (Throwable e) { + blocksOpMode.handleFatalException(e); + throw new AssertionError("impossible", e); + } finally { + endBlockExecution(); + } + } } diff --git a/FtcCommon/build.gradle b/FtcCommon/build.gradle index c3d0128e..af448da9 100644 --- a/FtcCommon/build.gradle +++ b/FtcCommon/build.gradle @@ -1,31 +1,13 @@ apply plugin: 'com.android.library' - -android.buildFeatures.buildConfig true +apply from: '../build.androidVersionCommon.gradle' android { - namespace 'com.qualcomm.ftccommon' - compileSdkVersion 29 - defaultConfig { - minSdkVersion 23 - targetSdkVersion 28 - versionCode 110 - versionName "22.1" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + versionCode 115 + versionName "23.1" } - } dependencies { @@ -41,4 +23,4 @@ dependencies { * External */ implementation fileTree(include: ['*.jar'], dir: 'libs') -} \ No newline at end of file +} diff --git a/FtcCommon/proguard-rules.pro b/FtcCommon/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/FtcCommon/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/FtcCommon/src/main/AndroidManifest.xml b/FtcCommon/src/main/AndroidManifest.xml index 98389723..a1a36cb1 100644 --- a/FtcCommon/src/main/AndroidManifest.xml +++ b/FtcCommon/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - + - \ No newline at end of file + diff --git a/FtcRobotController/build.gradle b/FtcRobotController/build.gradle index fc521b5a..b271b761 100644 --- a/FtcRobotController/build.gradle +++ b/FtcRobotController/build.gradle @@ -1,33 +1,17 @@ import java.text.SimpleDateFormat +// +// build.gradle in FtcRobotController +// apply plugin: 'com.android.library' - -android.buildFeatures.buildConfig true +apply from: '../build.androidVersionCommon.gradle' android { - - namespace 'com.qualcomm.ftcrobotcontroller' - - compileSdkVersion 29 - defaultConfig { - minSdkVersion 23 - targetSdkVersion 28 - versionCode 56 - versionName "11.0" - buildConfigField "String", "APP_BUILD_TIME", '"' + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ROOT).format(new Date())) + '"' } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - - ndkVersion '21.3.6528147' - + namespace 'com.qualcomm.ftcrobotcontroller' } dependencies { diff --git a/FtcRobotController/proguard-rules.pro b/FtcRobotController/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/FtcRobotController/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/FtcRobotController/src/main/AndroidManifest.xml b/FtcRobotController/src/main/AndroidManifest.xml index 99420297..4c585768 100644 --- a/FtcRobotController/src/main/AndroidManifest.xml +++ b/FtcRobotController/src/main/AndroidManifest.xml @@ -1,9 +1,8 @@ + android:versionCode="61" + android:versionName="11.1"> diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTag.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTag.java index 8ec77dd8..4ee7ffef 100644 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTag.java +++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTag.java @@ -92,24 +92,22 @@ public void runOpMode() { telemetry.update(); waitForStart(); - if (opModeIsActive()) { - while (opModeIsActive()) { + while (opModeIsActive()) { - telemetryAprilTag(); + telemetryAprilTag(); - // Push telemetry to the Driver Station. - telemetry.update(); + // Push telemetry to the Driver Station. + telemetry.update(); - // Save CPU resources; can resume streaming when needed. - if (gamepad1.dpad_down) { - visionPortal.stopStreaming(); - } else if (gamepad1.dpad_up) { - visionPortal.resumeStreaming(); - } - - // Share the CPU. - sleep(20); + // Save CPU resources; can resume streaming when needed. + if (gamepad1.dpad_down) { + visionPortal.stopStreaming(); + } else if (gamepad1.dpad_up) { + visionPortal.resumeStreaming(); } + + // Share the CPU. + sleep(20); } // Save more CPU resources when camera is no longer needed. diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagEasy.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagEasy.java index 12dcf6e9..7bda71b4 100644 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagEasy.java +++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagEasy.java @@ -88,24 +88,22 @@ public void runOpMode() { telemetry.update(); waitForStart(); - if (opModeIsActive()) { - while (opModeIsActive()) { + while (opModeIsActive()) { - telemetryAprilTag(); + telemetryAprilTag(); - // Push telemetry to the Driver Station. - telemetry.update(); + // Push telemetry to the Driver Station. + telemetry.update(); - // Save CPU resources; can resume streaming when needed. - if (gamepad1.dpad_down) { - visionPortal.stopStreaming(); - } else if (gamepad1.dpad_up) { - visionPortal.resumeStreaming(); - } - - // Share the CPU. - sleep(20); + // Save CPU resources; can resume streaming when needed. + if (gamepad1.dpad_down) { + visionPortal.stopStreaming(); + } else if (gamepad1.dpad_up) { + visionPortal.resumeStreaming(); } + + // Share the CPU. + sleep(20); } // Save more CPU resources when camera is no longer needed. diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagSwitchableCameras.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagSwitchableCameras.java index 7ee1064b..02e83d37 100644 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagSwitchableCameras.java +++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptAprilTagSwitchableCameras.java @@ -81,27 +81,25 @@ public void runOpMode() { telemetry.update(); waitForStart(); - if (opModeIsActive()) { - while (opModeIsActive()) { + while (opModeIsActive()) { - telemetryCameraSwitching(); - telemetryAprilTag(); + telemetryCameraSwitching(); + telemetryAprilTag(); - // Push telemetry to the Driver Station. - telemetry.update(); + // Push telemetry to the Driver Station. + telemetry.update(); - // Save CPU resources; can resume streaming when needed. - if (gamepad1.dpad_down) { - visionPortal.stopStreaming(); - } else if (gamepad1.dpad_up) { - visionPortal.resumeStreaming(); - } + // Save CPU resources; can resume streaming when needed. + if (gamepad1.dpad_down) { + visionPortal.stopStreaming(); + } else if (gamepad1.dpad_up) { + visionPortal.resumeStreaming(); + } - doCameraSwitching(); + doCameraSwitching(); - // Share the CPU. - sleep(20); - } + // Share the CPU. + sleep(20); } // Save more CPU resources when camera is no longer needed. diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptGamepadEdgeDetection.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptGamepadEdgeDetection.java index 90243ac5..d3c4417a 100644 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptGamepadEdgeDetection.java +++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptGamepadEdgeDetection.java @@ -83,6 +83,22 @@ public void telemetryButtonData() { telemetry.addData("Gamepad 1 Right Bumper Released", gamepad1.rightBumperWasReleased()); telemetry.addData("Gamepad 1 Right Bumper Status", gamepad1.right_bumper); + // Add an empty line to separate the buttons in telemetry + telemetry.addLine(); + + // Add the status of the Gamepad 1 Left trigger + telemetry.addData("Gamepad 1 Left Trigger Pressed", gamepad1.leftTriggerWasPressed()); + telemetry.addData("Gamepad 1 Left Trigger Released", gamepad1.leftTriggerWasReleased()); + telemetry.addData("Gamepad 1 Left Trigger Status", gamepad1.left_trigger_pressed); + + // Add an empty line to separate the buttons in telemetry + telemetry.addLine(); + + // Add the status of the Gamepad 1 Right trigger + telemetry.addData("Gamepad 1 Right Trigger Pressed", gamepad1.rightTriggerWasPressed()); + telemetry.addData("Gamepad 1 Right Trigger Released", gamepad1.rightTriggerWasReleased()); + telemetry.addData("Gamepad 1 Right Trigger Status", gamepad1.right_trigger_pressed); + // Add a note that the telemetry is only updated every 2 seconds telemetry.addLine("\nTelemetry is updated every 2 seconds."); diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/ConceptExternalHardwareClass.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/ConceptExternalHardwareClass.java index 7a721fef..cee35f64 100644 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/ConceptExternalHardwareClass.java +++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/ConceptExternalHardwareClass.java @@ -27,7 +27,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.firstinspires.ftc.robotcontroller.external.samples; +package org.firstinspires.ftc.robotcontroller.external.samples.externalhardware; import com.qualcomm.robotcore.eventloop.opmode.Disabled; import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/RobotHardware.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/RobotHardware.java index b1c8de62..64f2206f 100644 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/RobotHardware.java +++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/externalhardware/RobotHardware.java @@ -27,7 +27,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.firstinspires.ftc.robotcontroller.external.samples; +package org.firstinspires.ftc.robotcontroller.external.samples.externalhardware; import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; import com.qualcomm.robotcore.hardware.DcMotor; diff --git a/Hardware/build.gradle b/Hardware/build.gradle index 56feae08..3992e2fa 100644 --- a/Hardware/build.gradle +++ b/Hardware/build.gradle @@ -1,31 +1,13 @@ apply plugin: 'com.android.library' - -android.buildFeatures.buildConfig true +apply from: '../build.androidVersionCommon.gradle' android { - namespace 'com.qualcomm.hardware' - compileSdkVersion 29 - - defaultConfig { - minSdkVersion 23 - targetSdkVersion 28 - versionCode 110 - versionName "22.1" + defaultConfig { + versionCode 115 + versionName "23.1" } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - } dependencies { diff --git a/Hardware/proguard-rules.pro b/Hardware/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/Hardware/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/Hardware/src/main/AndroidManifest.xml b/Hardware/src/main/AndroidManifest.xml index b50472e5..9a40236b 100644 --- a/Hardware/src/main/AndroidManifest.xml +++ b/Hardware/src/main/AndroidManifest.xml @@ -1,5 +1,3 @@ - - - \ No newline at end of file + + diff --git a/Hardware/src/main/java/com/qualcomm/hardware/gobilda/GoBildaPinpointDriver.java b/Hardware/src/main/java/com/qualcomm/hardware/gobilda/GoBildaPinpointDriver.java index 0a5a592e..3d6637fd 100644 --- a/Hardware/src/main/java/com/qualcomm/hardware/gobilda/GoBildaPinpointDriver.java +++ b/Hardware/src/main/java/com/qualcomm/hardware/gobilda/GoBildaPinpointDriver.java @@ -23,6 +23,7 @@ package com.qualcomm.hardware.gobilda; import static com.qualcomm.robotcore.util.TypeConversion.byteArrayToInt; +import static com.qualcomm.robotcore.util.TypeConversion.intToByteArray; import com.qualcomm.hardware.lynx.LynxI2cDeviceSynch; import com.qualcomm.robotcore.hardware.I2cAddr; @@ -30,16 +31,19 @@ import com.qualcomm.robotcore.hardware.I2cDeviceSynchSimple; import com.qualcomm.robotcore.hardware.configuration.annotations.DeviceProperties; import com.qualcomm.robotcore.hardware.configuration.annotations.I2cDeviceType; -import com.qualcomm.robotcore.util.TypeConversion; import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit; import org.firstinspires.ftc.robotcore.external.navigation.Pose2D; +import org.firstinspires.ftc.robotcore.external.navigation.Quaternion; import org.firstinspires.ftc.robotcore.external.navigation.UnnormalizedAngleUnit; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; +import java.util.stream.Stream; @I2cDeviceType @@ -51,6 +55,8 @@ public class GoBildaPinpointDriver extends I2cDeviceSynchDevice { + private int deviceID = 0; + private int deviceVersion = 0; private int deviceStatus = 0; private int loopTime = 0; private int xEncoderValue = 0; @@ -61,10 +67,48 @@ public class GoBildaPinpointDriver extends I2cDeviceSynchDevice RegisterType.GENERIC.length) { + if (computeCRC8(Arrays.copyOfRange(byteArray, 0, RegisterType.GENERIC.length)) == byteArray[(RegisterType.GENERIC.length + CRC_SIZE) - 1]) { + return true; + } else { + deviceStatus = DeviceStatus.FAULT_BAD_READ.status; + return false; + } + } + return false; + } + + /** + * Computes the correct CRC8 for a byteArray. + * + * @param byteArray data to check + * @return byte to compare against received CRC. + */ + private byte computeCRC8(byte[] byteArray) { + byte crc = CRC_INITIAL_VALUE; + + for (byte b : byteArray) { + crc ^= b; + for (int i = 0; i < 8; i++) { + if ((crc & 0x80) != 0) { + crc = (byte) ((crc << 1) ^ CRC_POLYNOMIAL_VALUE); + } else { + crc <<= 1; + } + } + } + return (byte) (crc ^ CRC_FINAL_XOR_VALUE); + } + /** * Confirm that the number received is a number, and does not include a change above the threshold * @@ -310,9 +541,9 @@ private Float isPositionCorrupt(float oldValue, float newValue, int threshold, b * @param threshold the velocity allowed to be reported * @return newValue if the velocity is good, oldValue otherwise */ - private Float isVelocityCorrupt(float oldValue, float newValue, int threshold) { - boolean isCorrupt = Float.isNaN(newValue) || Math.abs(newValue) > threshold; - boolean noData = (loopTime <= 1); + private Float isVelocityCorrupt(float oldValue, float newValue, int threshold, boolean bulkUpdate) { + boolean noData = bulkUpdate && (loopTime <= 1); + boolean isCorrupt = noData || Float.isNaN(newValue) || Math.abs(newValue) > threshold; if (!isCorrupt) { return newValue; @@ -323,9 +554,42 @@ private Float isVelocityCorrupt(float oldValue, float newValue, int threshold) { } /** - * Call this once per loop to read new data from the Odometry Computer. Data will only update once this is called. + * Reads the BULK_READ register depending on how the bulkReadScope is configured and saves data to local variables. + * if CRC is enabled, and a bad CRC is detected on the BulkRead, then no data will be saved. */ - public void update() { + private void flexBulkRead() { + byte[] bArr; + + if (errorDetectionType == ErrorDetectionType.CRC) { + bArr = deviceClient.read(Register.BULK_READ.bVal, (bulkReadScope.length * RegisterType.GENERIC.length) + CRC_SIZE); + if (!checkCRC(bArr, RegisterType.BULK)) { + return; + } + } else { + bArr = deviceClient.read(Register.BULK_READ.bVal, (bulkReadScope.length * RegisterType.GENERIC.length)); + } + + for (int i = 0; i < bulkReadScope.length; i++) { + int index = i * RegisterType.GENERIC.length; + switch (bulkReadScope[i].registerType) { + case INT32: + int dataI = byteArrayToInt(Arrays.copyOfRange(bArr, index, index + bulkReadScope[i].registerType.length), ByteOrder.LITTLE_ENDIAN); + saveData(bulkReadScope[i], dataI, 0); + break; + case FLOAT: + float dataF = byteArrayToFloat(Arrays.copyOfRange(bArr, index, index + bulkReadScope[i].registerType.length), ByteOrder.LITTLE_ENDIAN); + saveData(bulkReadScope[i], 0, dataF); + break; + } + } + } + + /** + * For devices with version 1 or version 2 firmware, this reads a fixed length BULK_READ register.
+ * A warning is thrown if CRC is requested as CRC was not enabled on V1 or V2 devices. + */ + private void fixedBulkRead() { + final int positionThreshold = 5000; //more than one FTC field in mm final int headingThreshold = 120; //About 20 full rotations in Radians final int velocityThreshold = 10000; //10k mm/sec is faster than an FTC robot should be going... @@ -350,17 +614,69 @@ public void update() { yVelocity = byteArrayToFloat(Arrays.copyOfRange(bArr, 32, 36), ByteOrder.LITTLE_ENDIAN); hVelocity = byteArrayToFloat(Arrays.copyOfRange(bArr, 36, 40), ByteOrder.LITTLE_ENDIAN); - /* - * Check to see if any of the floats we have received from the device are NaN or are too large - * if they are, we return the previously read value and alert the user via the DeviceStatus Enum. - */ - xPosition = isPositionCorrupt(oldPosX, xPosition, positionThreshold, true); - yPosition = isPositionCorrupt(oldPosY, yPosition, positionThreshold, true); - hOrientation = isPositionCorrupt(oldPosH, hOrientation, headingThreshold, true); - xVelocity = isVelocityCorrupt(oldVelX, xVelocity, velocityThreshold); - yVelocity = isVelocityCorrupt(oldVelY, yVelocity, velocityThreshold); - hVelocity = isVelocityCorrupt(oldVelH, hVelocity, headingVelocityThreshold); + switch (errorDetectionType) { + case CRC: + throw new RuntimeException("CRC Error Handling Not Supported by this Firmware"); + case LOCAL_TEST: + /* + * Check to see if any of the floats we have received from the device are NaN or are too large + * if they are, we return the previously read value and alert the user via the DeviceStatus Enum. + */ + xPosition = isPositionCorrupt(oldPosX, xPosition, positionThreshold, true); + yPosition = isPositionCorrupt(oldPosY, yPosition, positionThreshold, true); + hOrientation = isPositionCorrupt(oldPosH, hOrientation, headingThreshold, true); + xVelocity = isVelocityCorrupt(oldVelX, xVelocity, velocityThreshold, true); + yVelocity = isVelocityCorrupt(oldVelY, yVelocity, velocityThreshold, true); + hVelocity = isVelocityCorrupt(oldVelH, hVelocity, headingVelocityThreshold, true); + break; + } + } + /** + * Reads a register and saves the data found there to the local variable. Uses either CRC or Local error detection. + * + * @param register register to read + */ + private void readRegister(Register register) { + boolean checkCRC = (errorDetectionType == ErrorDetectionType.CRC); + + byte[] temp = deviceClient.read(register.bVal, RegisterType.GENERIC.length + CRC_SIZE); + + switch (register.registerType) { + case INT32: + if (checkCRC(temp, RegisterType.INT32) || !checkCRC) { + saveData(register, byteArrayToInt(Arrays.copyOfRange(temp, 0, RegisterType.INT32.length), ByteOrder.LITTLE_ENDIAN), 0); + } else { + deviceStatus = DeviceStatus.FAULT_BAD_READ.status; + } + break; + case FLOAT: + if (checkCRC(temp, RegisterType.FLOAT) || !checkCRC) { + saveData(register, 0, byteArrayToFloat(Arrays.copyOfRange(temp, 0, RegisterType.FLOAT.length), ByteOrder.LITTLE_ENDIAN)); + } else { + deviceStatus = DeviceStatus.FAULT_BAD_READ.status; + } + break; + case BULK: + update(); + break; + } + } + + /** + * Call this once per loop to read new data from the Odometry Computer. Data will only update once this is called. + */ + public void update() { + if (deviceVersion == 0) { + getDeviceVersion(); // Makes sure device version has been read + } + + if (deviceVersion == 1 || deviceVersion == 2) { + fixedBulkRead(); + } + if (deviceVersion >= 3) { + flexBulkRead(); + } } /** @@ -386,6 +702,50 @@ public void update(ReadData data) { } } + /** + * Only supported on V3 firmware and above. This configures the registers that are read in bulk + * when .update() is called. Use this to minimize read times based on your unique application. + * + * @param registers An array of registers, add registers that you need data from frequently. + */ + public void setBulkReadScope(Register... registers) { + + if (deviceVersion == 0) { + deviceVersion = readInt(Register.DEVICE_VERSION); + } + if (deviceVersion == 1 || deviceVersion == 2) { + throw new RuntimeException(".setBulkReadScope is not supported by this device firmware."); + } + if (deviceVersion >= 3) { + bulkReadScope = registers.clone(); + + Stream reg = Arrays.stream(registers).distinct(); + ArrayList arrayList = new ArrayList<>(registers.length); + + Iterator iter = reg.iterator(); + while (iter.hasNext()) { + arrayList.add((byte) iter.next().bVal); + } + + byte[] arr = new byte[arrayList.size()]; + for (int i = 0; i < arrayList.size(); i++) { + arr[i] = arrayList.get(i); + } + writeByteArray(Register.SET_BULK_READ, arr); //write all registers sequentially + } + } + + /** + * The kind of error correction used on the I²C communication from the device.

+ * NONE: This does not check the data, and passes it directly to the user.
+ * CRC: This uses CRC8 error detection to catch incorrect reads. - Only supported by devices with V3 firmware or newer.
+ * LOCAL_TEST: "Controller only" validation that ensures that the data is !NAN, is not all zeros, and is a reasonable number. + * This is faster than CRC but may not catch every erroneous read.
+ */ + public void setErrorDetectionType(ErrorDetectionType e) { + errorDetectionType = e; + } + /** * Sets the odometry pod positions relative to the point that the odometry computer tracks around.

* The most common tracking position is the center of the robot.

@@ -461,11 +821,11 @@ public void setEncoderResolution(GoBildaOdometryPods pods) { * You can find this number by dividing the counts-per-revolution of your encoder by the circumference of the wheel. * * @param ticksPerUnit should be somewhere between 10 ticks/mm and 100 ticks/mm a goBILDA Swingarm pod is ~13.26291192 - * @param distanceUnit unit used for distance + * @param distanceUnit unit used for distance */ public void setEncoderResolution(double ticksPerUnit, DistanceUnit distanceUnit) { - double resolution = distanceUnit.toMm(ticksPerUnit); - writeByteArray(Register.TICKS_PER_MM, (floatToByteArray((float) resolution, ByteOrder.LITTLE_ENDIAN))); + double resolution = 1.0 / distanceUnit.toMm(1.0 / ticksPerUnit); + writeByteArray(Register.MM_PER_TICK, (floatToByteArray((float) resolution, ByteOrder.LITTLE_ENDIAN))); } /** @@ -553,21 +913,30 @@ public void setHeading(double heading, AngleUnit angleUnit) { * @return 1 if device is functional. */ public int getDeviceID() { - return readInt(Register.DEVICE_ID); + if (registerNotInBulkRead(Register.DEVICE_ID)) { + readRegister(Register.DEVICE_ID); + } + return deviceID; } /** * @return the firmware version of the Odometry Computer */ public int getDeviceVersion() { - return readInt(Register.DEVICE_VERSION); + if (registerNotInBulkRead(Register.DEVICE_VERSION)) { + readRegister(Register.DEVICE_VERSION); + } + return deviceVersion; } /** * @return a scalar that the IMU measured heading is multiplied by. */ public float getYawScalar() { - return readFloat(Register.YAW_SCALAR); + if (registerNotInBulkRead(Register.YAW_SCALAR)) { + readRegister(Register.YAW_SCALAR); + } + return yawScalar; } /** @@ -615,6 +984,9 @@ public double getFrequency() { * @return the raw value of the X (forward) encoder in ticks */ public int getEncoderX() { + if (registerNotInBulkRead(Register.X_ENCODER_VALUE)) { + readRegister(Register.X_ENCODER_VALUE); + } return xEncoderValue; } @@ -622,6 +994,9 @@ public int getEncoderX() { * @return the raw value of the Y (strafe) encoder in ticks */ public int getEncoderY() { + if (registerNotInBulkRead(Register.Y_ENCODER_VALUE)) { + readRegister(Register.Y_ENCODER_VALUE); + } return yEncoderValue; } @@ -630,6 +1005,9 @@ public int getEncoderY() { * @return the estimated X (forward) position of the robot in specified unit */ public double getPosX(DistanceUnit distanceUnit) { + if (registerNotInBulkRead(Register.X_POSITION)) { + readRegister(Register.X_POSITION); + } return distanceUnit.fromMm(xPosition); } @@ -638,6 +1016,9 @@ public double getPosX(DistanceUnit distanceUnit) { * @return the estimated Y (Strafe) position of the robot in specified unit */ public double getPosY(DistanceUnit distanceUnit) { + if (registerNotInBulkRead(Register.Y_POSITION)) { + readRegister(Register.Y_POSITION); + } return distanceUnit.fromMm(yPosition); } @@ -646,6 +1027,9 @@ public double getPosY(DistanceUnit distanceUnit) { * normalized heading is wrapped from -180°, to 180°. */ public double getHeading(AngleUnit angleUnit) { + if (registerNotInBulkRead(Register.H_ORIENTATION)) { + readRegister(Register.H_ORIENTATION); + } return angleUnit.fromRadians(hOrientation); } @@ -655,6 +1039,9 @@ public double getHeading(AngleUnit angleUnit) { * multiple rotations. */ public double getHeading(UnnormalizedAngleUnit unnormalizedAngleUnit) { + if (registerNotInBulkRead(Register.H_ORIENTATION)) { + readRegister(Register.H_ORIENTATION); + } return unnormalizedAngleUnit.fromRadians(hOrientation); } @@ -662,6 +1049,9 @@ public double getHeading(UnnormalizedAngleUnit unnormalizedAngleUnit) { * @return the estimated X (forward) velocity of the robot in specified unit/sec */ public double getVelX(DistanceUnit distanceUnit) { + if (registerNotInBulkRead(Register.X_VELOCITY)) { + readRegister(Register.X_VELOCITY); + } return distanceUnit.fromMm(xVelocity); } @@ -669,6 +1059,9 @@ public double getVelX(DistanceUnit distanceUnit) { * @return the estimated Y (strafe) velocity of the robot in specified unit/sec */ public double getVelY(DistanceUnit distanceUnit) { + if (registerNotInBulkRead(Register.Y_VELOCITY)) { + readRegister(Register.Y_VELOCITY); + } return distanceUnit.fromMm(yVelocity); } @@ -676,6 +1069,9 @@ public double getVelY(DistanceUnit distanceUnit) { * @return the estimated H (heading) velocity of the robot in specified unit/sec */ public double getHeadingVelocity(UnnormalizedAngleUnit unnormalizedAngleUnit) { + if (registerNotInBulkRead(Register.H_VELOCITY)) { + readRegister(Register.H_VELOCITY); + } return unnormalizedAngleUnit.fromRadians(hVelocity); } @@ -685,7 +1081,10 @@ public double getHeadingVelocity(UnnormalizedAngleUnit unnormalizedAngleUnit) { * @return the user-set offset for the X (forward) pod in specified unit */ public float getXOffset(DistanceUnit distanceUnit) { - return (float) distanceUnit.fromMm(readFloat(Register.X_POD_OFFSET)); + if (registerNotInBulkRead(Register.X_POD_OFFSET)) { + readRegister(Register.X_POD_OFFSET); + } + return (float) distanceUnit.fromMm(xPodOffset); } /** @@ -694,22 +1093,90 @@ public float getXOffset(DistanceUnit distanceUnit) { * @return the user-set offset for the Y (strafe) pod */ public float getYOffset(DistanceUnit distanceUnit) { - return (float) distanceUnit.fromMm(readFloat(Register.Y_POD_OFFSET)); + if (registerNotInBulkRead(Register.Y_POD_OFFSET)) { + readRegister(Register.Y_POD_OFFSET); + } + return (float) distanceUnit.fromMm(yPodOffset); } /** * @return a Pose2D containing the estimated position of the robot */ public Pose2D getPosition() { + if (registerNotInBulkRead(Register.X_POSITION)) { + readRegister(Register.X_POSITION); + } + if (registerNotInBulkRead(Register.Y_POSITION)) { + readRegister(Register.Y_POSITION); + } + if (registerNotInBulkRead(Register.H_ORIENTATION)) { + readRegister(Register.H_ORIENTATION); + } return new Pose2D(DistanceUnit.MM, xPosition, yPosition, AngleUnit.RADIANS, AngleUnit.normalizeRadians(hOrientation)); } -} - + /** + * @return a Quaternion which describes the 3d orientation of the device. + */ + public Quaternion getQuaternion() { + if (deviceVersion == 0) { + readInt(Register.DEVICE_VERSION); + } + if (deviceVersion == 1 || deviceVersion == 2) { + throw new RuntimeException("Quaternion output is not supported on this device firmware"); + } else { + if (registerNotInBulkRead(Register.QUATERNION_W)) { + readRegister(Register.QUATERNION_W); + } + if (registerNotInBulkRead(Register.QUATERNION_X)) { + readRegister(Register.QUATERNION_X); + } + if (registerNotInBulkRead(Register.QUATERNION_Y)) { + readRegister(Register.QUATERNION_Y); + } + if (registerNotInBulkRead(Register.QUATERNION_Z)) { + readRegister(Register.QUATERNION_Z); + } + return new Quaternion(quaternionW, quaternionX, quaternionY, quaternionZ, 0); + } + } + /** + * @return the current pitch of the device in the specified AngleUnit. + */ + public double getPitch(AngleUnit angleUnit) { + if (deviceVersion == 0) { + readInt(Register.DEVICE_VERSION); + } + if (deviceVersion == 1 || deviceVersion == 2) { + throw new RuntimeException("IMU Pitch output is not supported on this device firmware"); + } else { + if (registerNotInBulkRead(Register.PITCH)) { + pitch = readFloat(Register.PITCH); + } + return angleUnit.fromRadians(pitch); + } + } + /** + * @return the current roll of the device in the specified AngleUnit. + */ + public double getRoll(AngleUnit angleUnit) { + if (deviceVersion == 0) { + readInt(Register.DEVICE_VERSION); + } + if (deviceVersion == 1 || deviceVersion == 2) { + throw new RuntimeException("IMU Roll output is not supported on this device firmware"); + } else { + if (registerNotInBulkRead(Register.ROLL)) { + roll = readFloat(Register.ROLL); + } + return angleUnit.fromRadians(roll); + } + } +} \ No newline at end of file diff --git a/Inspection/build.gradle b/Inspection/build.gradle index ac05f601..11aa5ec3 100644 --- a/Inspection/build.gradle +++ b/Inspection/build.gradle @@ -1,27 +1,13 @@ apply plugin: 'com.android.library' - -android.buildFeatures.buildConfig true +apply from: '../build.androidVersionCommon.gradle' android { - namespace 'org.firstinspires.inspection' - compileSdkVersion 29 - defaultConfig { - minSdkVersion 23 - targetSdkVersion 28 - versionCode 110 - versionName "22.1" + versionCode 115 + versionName "23.1" } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - } dependencies { diff --git a/Inspection/proguard-rules.pro b/Inspection/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/Inspection/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/Inspection/src/main/AndroidManifest.xml b/Inspection/src/main/AndroidManifest.xml index 3b2f3b1e..db0ba2be 100644 --- a/Inspection/src/main/AndroidManifest.xml +++ b/Inspection/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + @@ -23,4 +22,4 @@ - \ No newline at end of file + diff --git a/OnBotJava/build.gradle b/OnBotJava/build.gradle index b234a06e..20d8a5be 100644 --- a/OnBotJava/build.gradle +++ b/OnBotJava/build.gradle @@ -1,31 +1,13 @@ apply plugin: 'com.android.library' - -android.buildFeatures.buildConfig true +apply from: '../build.androidVersionCommon.gradle' android { - namespace 'com.google.blocks.ftcrobotcontroller.onbotjava' - compileSdkVersion 29 - defaultConfig { - minSdkVersion 23 - targetSdkVersion 28 - versionCode 70 - versionName "14.1" + versionCode 75 + versionName "15.1" } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - } dependencies { diff --git a/OnBotJava/libs/javac.jar b/OnBotJava/libs/javac.jar index 94669ab54229e64cce572c154f37def791104960..54a9749e5284ce93adb5d3d7386a7dad2ee583c3 100644 GIT binary patch delta 53711 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 delta 52835 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 IPKgQmKTxle9{>OV diff --git a/OnBotJava/proguard-rules.pro b/OnBotJava/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/OnBotJava/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/OnBotJava/src/main/AndroidManifest.xml b/OnBotJava/src/main/AndroidManifest.xml index c3045cd3..86fee1e7 100644 --- a/OnBotJava/src/main/AndroidManifest.xml +++ b/OnBotJava/src/main/AndroidManifest.xml @@ -31,7 +31,6 @@ ~ 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. --> - + - \ No newline at end of file + diff --git a/OnBotJava/src/main/assets/java/js/worker/index.js b/OnBotJava/src/main/assets/java/js/worker/index.js index b8102f63..27d0a6d0 100644 --- a/OnBotJava/src/main/assets/java/js/worker/index.js +++ b/OnBotJava/src/main/assets/java/js/worker/index.js @@ -1,7 +1,7 @@ -(()=>{var X1=Object.create;var fs=Object.defineProperty,J1=Object.defineProperties,Q1=Object.getOwnPropertyDescriptor,Z1=Object.getOwnPropertyDescriptors,e4=Object.getOwnPropertyNames,jl=Object.getOwnPropertySymbols,t4=Object.getPrototypeOf,Ul=Object.prototype.hasOwnProperty,n4=Object.prototype.propertyIsEnumerable;var Vl=(h,k,G)=>k in h?fs(h,k,{enumerable:!0,configurable:!0,writable:!0,value:G}):h[k]=G,Zo=(h,k)=>{for(var G in k||(k={}))Ul.call(k,G)&&Vl(h,G,k[G]);if(jl)for(var G of jl(k))n4.call(k,G)&&Vl(h,G,k[G]);return h},es=(h,k)=>J1(h,Z1(k)),zl=h=>fs(h,"__esModule",{value:!0}),c=(h,k)=>fs(h,"name",{value:k,configurable:!0}),ts=(h=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(h,{get:(k,G)=>(typeof require!="undefined"?require:k)[G]}):h)(function(h){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+h+'" is not supported')});var fr=(h,k)=>()=>(k||h((k={exports:{}}).exports,k),k.exports),Ba=(h,k)=>{zl(h);for(var G in k)fs(h,G,{get:k[G],enumerable:!0})},r4=(h,k,G)=>{if(k&&typeof k=="object"||typeof k=="function")for(let T of e4(k))!Ul.call(h,T)&&T!=="default"&&fs(h,T,{get:()=>k[T],enumerable:!(G=Q1(k,T))||G.enumerable});return h},zn=h=>r4(zl(fs(h!=null?X1(t4(h)):{},"default",h&&h.__esModule&&"default"in h?{get:()=>h.default,enumerable:!0}:{value:h,enumerable:!0})),h);var Ji=fr((Kl,Ks)=>{(function(h,k){"use strict";typeof Ks=="object"&&typeof Ks.exports=="object"?Ks.exports=h.document?k(h,!0):function(G){if(!G.document)throw new Error("jQuery requires a window with a document");return k(G)}:k(h)})(typeof window!="undefined"?window:Kl,function(h,k){"use strict";var G=[],T=Object.getPrototypeOf,m=G.slice,a=G.flat?function(A){return G.flat.call(A)}:function(A){return G.concat.apply([],A)},o=G.push,s=G.indexOf,r={},i=r.toString,n=r.hasOwnProperty,t=n.toString,e=t.call(Object),d={},f=c(function(B){return typeof B=="function"&&typeof B.nodeType!="number"&&typeof B.item!="function"},"isFunction"),p=c(function(B){return B!=null&&B===B.window},"isWindow"),l=h.document,v={type:!0,src:!0,nonce:!0,noModule:!0};function y(A,B,j){j=j||l;var K,se,ae=j.createElement("script");if(ae.text=A,B)for(K in v)se=B[K]||B.getAttribute&&B.getAttribute(K),se&&ae.setAttribute(K,se);j.head.appendChild(ae).parentNode.removeChild(ae)}c(y,"DOMEval");function b(A){return A==null?A+"":typeof A=="object"||typeof A=="function"?r[i.call(A)]||"object":typeof A}c(b,"toType");var x="3.6.4",g=c(function(A,B){return new g.fn.init(A,B)},"jQuery");g.fn=g.prototype={jquery:x,constructor:g,length:0,toArray:function(){return m.call(this)},get:function(A){return A==null?m.call(this):A<0?this[A+this.length]:this[A]},pushStack:function(A){var B=g.merge(this.constructor(),A);return B.prevObject=this,B},each:function(A){return g.each(this,A)},map:function(A){return this.pushStack(g.map(this,function(B,j){return A.call(B,j,B)}))},slice:function(){return this.pushStack(m.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(g.grep(this,function(A,B){return(B+1)%2}))},odd:function(){return this.pushStack(g.grep(this,function(A,B){return B%2}))},eq:function(A){var B=this.length,j=+A+(A<0?B:0);return this.pushStack(j>=0&&j0&&B-1 in A}c(_,"isArrayLike");var S=function(A){var B,j,K,se,ae,he,He,Fe,st,vt,Ht,gt,bt,vn,w,F,O,W,z,q="sizzle"+1*new Date,oe=A.document,ge=0,de=0,Ee=rs(),Le=rs(),it=rs(),yt=rs(),Ct=c(function(ve,Pe){return ve===Pe&&(Ht=!0),0},"sortOrder"),ot={}.hasOwnProperty,qt=[],zt=qt.pop,sn=qt.push,xn=qt.push,An=qt.slice,qn=c(function(ve,Pe){for(var Je=0,Ot=ve.length;Je+~]|"+kn+")"+kn+"*"),uo=new RegExp(kn+"|>"),ne=new RegExp(Kn),ue=new RegExp("^"+xr+"$"),Re={ID:new RegExp("^#("+xr+")"),CLASS:new RegExp("^\\.("+xr+")"),TAG:new RegExp("^("+xr+"|[*])"),ATTR:new RegExp("^"+rr),PSEUDO:new RegExp("^"+Kn),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+kn+"*(even|odd|(([+-]|)(\\d*)n|)"+kn+"*(?:([+-]|)"+kn+"*(\\d+)|))"+kn+"*\\)|)","i"),bool:new RegExp("^(?:"+Mr+")$","i"),needsContext:new RegExp("^"+kn+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+kn+"*((?:-\\d)?\\d*)"+kn+"*\\)|)(?=[^-]|$)","i")},Oe=/HTML$/i,rt=/^(?:input|select|textarea|button)$/i,Qe=/^h\d$/i,Rt=/^[^{]+\{\s*\[native \w/,Yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Nn=/[+~]/,rn=new RegExp("\\\\[\\da-fA-F]{1,6}"+kn+"?|\\\\([^\\r\\n\\f])","g"),vr=c(function(ve,Pe){var Je="0x"+ve.slice(1)-65536;return Pe||(Je<0?String.fromCharCode(Je+65536):String.fromCharCode(Je>>10|55296,Je&1023|56320))},"funescape"),Er=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,$n=c(function(ve,Pe){return Pe?ve==="\0"?"\uFFFD":ve.slice(0,-1)+"\\"+ve.charCodeAt(ve.length-1).toString(16)+" ":"\\"+ve},"fcssescape"),co=c(function(){gt()},"unloadHandler"),yo=bo(function(ve){return ve.disabled===!0&&ve.nodeName.toLowerCase()==="fieldset"},{dir:"parentNode",next:"legend"});try{xn.apply(qt=An.call(oe.childNodes),oe.childNodes),qt[oe.childNodes.length].nodeType}catch{xn={apply:qt.length?function(Pe,Je){sn.apply(Pe,An.call(Je))}:function(Pe,Je){for(var Ot=Pe.length,at=0;Pe[Ot++]=Je[at++];);Pe.length=Ot-1}}}function Ar(ve,Pe,Je,Ot){var at,Wt,Vt,nn,cn,Fn,In,Bn=Pe&&Pe.ownerDocument,Hn=Pe?Pe.nodeType:9;if(Je=Je||[],typeof ve!="string"||!ve||Hn!==1&&Hn!==9&&Hn!==11)return Je;if(!Ot&&(gt(Pe),Pe=Pe||bt,w)){if(Hn!==11&&(cn=Yt.exec(ve)))if(at=cn[1]){if(Hn===9)if(Vt=Pe.getElementById(at)){if(Vt.id===at)return Je.push(Vt),Je}else return Je;else if(Bn&&(Vt=Bn.getElementById(at))&&z(Pe,Vt)&&Vt.id===at)return Je.push(Vt),Je}else{if(cn[2])return xn.apply(Je,Pe.getElementsByTagName(ve)),Je;if((at=cn[3])&&j.getElementsByClassName&&Pe.getElementsByClassName)return xn.apply(Je,Pe.getElementsByClassName(at)),Je}if(j.qsa&&!yt[ve+" "]&&(!F||!F.test(ve))&&(Hn!==1||Pe.nodeName.toLowerCase()!=="object")){if(In=ve,Bn=Pe,Hn===1&&(uo.test(ve)||Ei.test(ve))){for(Bn=Nn.test(ve)&&ys(Pe.parentNode)||Pe,(Bn!==Pe||!j.scope)&&((nn=Pe.getAttribute("id"))?nn=nn.replace(Er,$n):Pe.setAttribute("id",nn=q)),Fn=he(ve),Wt=Fn.length;Wt--;)Fn[Wt]=(nn?"#"+nn:":scope")+" "+Ko(Fn[Wt]);In=Fn.join(",")}try{return xn.apply(Je,Bn.querySelectorAll(In)),Je}catch{yt(ve,!0)}finally{nn===q&&Pe.removeAttribute("id")}}}return Fe(ve.replace(Sr,"$1"),Pe,Je,Ot)}c(Ar,"Sizzle");function rs(){var ve=[];function Pe(Je,Ot){return ve.push(Je+" ")>K.cacheLength&&delete Pe[ve.shift()],Pe[Je+" "]=Ot}return c(Pe,"cache"),Pe}c(rs,"createCache");function qr(ve){return ve[q]=!0,ve}c(qr,"markFunction");function to(ve){var Pe=bt.createElement("fieldset");try{return!!ve(Pe)}catch{return!1}finally{Pe.parentNode&&Pe.parentNode.removeChild(Pe),Pe=null}}c(to,"assert");function So(ve,Pe){for(var Je=ve.split("|"),Ot=Je.length;Ot--;)K.attrHandle[Je[Ot]]=Pe}c(So,"addHandle");function Gi(ve,Pe){var Je=Pe&&ve,Ot=Je&&ve.nodeType===1&&Pe.nodeType===1&&ve.sourceIndex-Pe.sourceIndex;if(Ot)return Ot;if(Je){for(;Je=Je.nextSibling;)if(Je===Pe)return-1}return ve?1:-1}c(Gi,"siblingCheck");function vs(ve){return function(Pe){var Je=Pe.nodeName.toLowerCase();return Je==="input"&&Pe.type===ve}}c(vs,"createInputPseudo");function is(ve){return function(Pe){var Je=Pe.nodeName.toLowerCase();return(Je==="input"||Je==="button")&&Pe.type===ve}}c(is,"createButtonPseudo");function Pi(ve){return function(Pe){return"form"in Pe?Pe.parentNode&&Pe.disabled===!1?"label"in Pe?"label"in Pe.parentNode?Pe.parentNode.disabled===ve:Pe.disabled===ve:Pe.isDisabled===ve||Pe.isDisabled!==!ve&&yo(Pe)===ve:Pe.disabled===ve:"label"in Pe?Pe.disabled===ve:!1}}c(Pi,"createDisabledPseudo");function Wn(ve){return qr(function(Pe){return Pe=+Pe,qr(function(Je,Ot){for(var at,Wt=ve([],Je.length,Pe),Vt=Wt.length;Vt--;)Je[at=Wt[Vt]]&&(Je[at]=!(Ot[at]=Je[at]))})})}c(Wn,"createPositionalPseudo");function ys(ve){return ve&&typeof ve.getElementsByTagName!="undefined"&&ve}c(ys,"testContext"),j=Ar.support={},ae=Ar.isXML=function(ve){var Pe=ve&&ve.namespaceURI,Je=ve&&(ve.ownerDocument||ve).documentElement;return!Oe.test(Pe||Je&&Je.nodeName||"HTML")},gt=Ar.setDocument=function(ve){var Pe,Je,Ot=ve?ve.ownerDocument||ve:oe;return Ot==bt||Ot.nodeType!==9||!Ot.documentElement||(bt=Ot,vn=bt.documentElement,w=!ae(bt),oe!=bt&&(Je=bt.defaultView)&&Je.top!==Je&&(Je.addEventListener?Je.addEventListener("unload",co,!1):Je.attachEvent&&Je.attachEvent("onunload",co)),j.scope=to(function(at){return vn.appendChild(at).appendChild(bt.createElement("div")),typeof at.querySelectorAll!="undefined"&&!at.querySelectorAll(":scope fieldset div").length}),j.cssHas=to(function(){try{return bt.querySelector(":has(*,:jqfake)"),!1}catch{return!0}}),j.attributes=to(function(at){return at.className="i",!at.getAttribute("className")}),j.getElementsByTagName=to(function(at){return at.appendChild(bt.createComment("")),!at.getElementsByTagName("*").length}),j.getElementsByClassName=Rt.test(bt.getElementsByClassName),j.getById=to(function(at){return vn.appendChild(at).id=q,!bt.getElementsByName||!bt.getElementsByName(q).length}),j.getById?(K.filter.ID=function(at){var Wt=at.replace(rn,vr);return function(Vt){return Vt.getAttribute("id")===Wt}},K.find.ID=function(at,Wt){if(typeof Wt.getElementById!="undefined"&&w){var Vt=Wt.getElementById(at);return Vt?[Vt]:[]}}):(K.filter.ID=function(at){var Wt=at.replace(rn,vr);return function(Vt){var nn=typeof Vt.getAttributeNode!="undefined"&&Vt.getAttributeNode("id");return nn&&nn.value===Wt}},K.find.ID=function(at,Wt){if(typeof Wt.getElementById!="undefined"&&w){var Vt,nn,cn,Fn=Wt.getElementById(at);if(Fn){if(Vt=Fn.getAttributeNode("id"),Vt&&Vt.value===at)return[Fn];for(cn=Wt.getElementsByName(at),nn=0;Fn=cn[nn++];)if(Vt=Fn.getAttributeNode("id"),Vt&&Vt.value===at)return[Fn]}return[]}}),K.find.TAG=j.getElementsByTagName?function(at,Wt){if(typeof Wt.getElementsByTagName!="undefined")return Wt.getElementsByTagName(at);if(j.qsa)return Wt.querySelectorAll(at)}:function(at,Wt){var Vt,nn=[],cn=0,Fn=Wt.getElementsByTagName(at);if(at==="*"){for(;Vt=Fn[cn++];)Vt.nodeType===1&&nn.push(Vt);return nn}return Fn},K.find.CLASS=j.getElementsByClassName&&function(at,Wt){if(typeof Wt.getElementsByClassName!="undefined"&&w)return Wt.getElementsByClassName(at)},O=[],F=[],(j.qsa=Rt.test(bt.querySelectorAll))&&(to(function(at){var Wt;vn.appendChild(at).innerHTML="",at.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+kn+`*(?:''|"")`),at.querySelectorAll("[selected]").length||F.push("\\["+kn+"*(?:value|"+Mr+")"),at.querySelectorAll("[id~="+q+"-]").length||F.push("~="),Wt=bt.createElement("input"),Wt.setAttribute("name",""),at.appendChild(Wt),at.querySelectorAll("[name='']").length||F.push("\\["+kn+"*name"+kn+"*="+kn+`*(?:''|"")`),at.querySelectorAll(":checked").length||F.push(":checked"),at.querySelectorAll("a#"+q+"+*").length||F.push(".#.+[+~]"),at.querySelectorAll("\\\f"),F.push("[\\r\\n\\f]")}),to(function(at){at.innerHTML="";var Wt=bt.createElement("input");Wt.setAttribute("type","hidden"),at.appendChild(Wt).setAttribute("name","D"),at.querySelectorAll("[name=d]").length&&F.push("name"+kn+"*[*^$|!~]?="),at.querySelectorAll(":enabled").length!==2&&F.push(":enabled",":disabled"),vn.appendChild(at).disabled=!0,at.querySelectorAll(":disabled").length!==2&&F.push(":enabled",":disabled"),at.querySelectorAll("*,:x"),F.push(",.*:")})),(j.matchesSelector=Rt.test(W=vn.matches||vn.webkitMatchesSelector||vn.mozMatchesSelector||vn.oMatchesSelector||vn.msMatchesSelector))&&to(function(at){j.disconnectedMatch=W.call(at,"*"),W.call(at,"[s!='']:x"),O.push("!=",Kn)}),j.cssHas||F.push(":has"),F=F.length&&new RegExp(F.join("|")),O=O.length&&new RegExp(O.join("|")),Pe=Rt.test(vn.compareDocumentPosition),z=Pe||Rt.test(vn.contains)?function(at,Wt){var Vt=at.nodeType===9&&at.documentElement||at,nn=Wt&&Wt.parentNode;return at===nn||!!(nn&&nn.nodeType===1&&(Vt.contains?Vt.contains(nn):at.compareDocumentPosition&&at.compareDocumentPosition(nn)&16))}:function(at,Wt){if(Wt){for(;Wt=Wt.parentNode;)if(Wt===at)return!0}return!1},Ct=Pe?function(at,Wt){if(at===Wt)return Ht=!0,0;var Vt=!at.compareDocumentPosition-!Wt.compareDocumentPosition;return Vt||(Vt=(at.ownerDocument||at)==(Wt.ownerDocument||Wt)?at.compareDocumentPosition(Wt):1,Vt&1||!j.sortDetached&&Wt.compareDocumentPosition(at)===Vt?at==bt||at.ownerDocument==oe&&z(oe,at)?-1:Wt==bt||Wt.ownerDocument==oe&&z(oe,Wt)?1:vt?qn(vt,at)-qn(vt,Wt):0:Vt&4?-1:1)}:function(at,Wt){if(at===Wt)return Ht=!0,0;var Vt,nn=0,cn=at.parentNode,Fn=Wt.parentNode,In=[at],Bn=[Wt];if(!cn||!Fn)return at==bt?-1:Wt==bt?1:cn?-1:Fn?1:vt?qn(vt,at)-qn(vt,Wt):0;if(cn===Fn)return Gi(at,Wt);for(Vt=at;Vt=Vt.parentNode;)In.unshift(Vt);for(Vt=Wt;Vt=Vt.parentNode;)Bn.unshift(Vt);for(;In[nn]===Bn[nn];)nn++;return nn?Gi(In[nn],Bn[nn]):In[nn]==oe?-1:Bn[nn]==oe?1:0}),bt},Ar.matches=function(ve,Pe){return Ar(ve,null,null,Pe)},Ar.matchesSelector=function(ve,Pe){if(gt(ve),j.matchesSelector&&w&&!yt[Pe+" "]&&(!O||!O.test(Pe))&&(!F||!F.test(Pe)))try{var Je=W.call(ve,Pe);if(Je||j.disconnectedMatch||ve.document&&ve.document.nodeType!==11)return Je}catch{yt(Pe,!0)}return Ar(Pe,bt,null,[ve]).length>0},Ar.contains=function(ve,Pe){return(ve.ownerDocument||ve)!=bt&>(ve),z(ve,Pe)},Ar.attr=function(ve,Pe){(ve.ownerDocument||ve)!=bt&>(ve);var Je=K.attrHandle[Pe.toLowerCase()],Ot=Je&&ot.call(K.attrHandle,Pe.toLowerCase())?Je(ve,Pe,!w):void 0;return Ot!==void 0?Ot:j.attributes||!w?ve.getAttribute(Pe):(Ot=ve.getAttributeNode(Pe))&&Ot.specified?Ot.value:null},Ar.escape=function(ve){return(ve+"").replace(Er,$n)},Ar.error=function(ve){throw new Error("Syntax error, unrecognized expression: "+ve)},Ar.uniqueSort=function(ve){var Pe,Je=[],Ot=0,at=0;if(Ht=!j.detectDuplicates,vt=!j.sortStable&&ve.slice(0),ve.sort(Ct),Ht){for(;Pe=ve[at++];)Pe===ve[at]&&(Ot=Je.push(at));for(;Ot--;)ve.splice(Je[Ot],1)}return vt=null,ve},se=Ar.getText=function(ve){var Pe,Je="",Ot=0,at=ve.nodeType;if(at){if(at===1||at===9||at===11){if(typeof ve.textContent=="string")return ve.textContent;for(ve=ve.firstChild;ve;ve=ve.nextSibling)Je+=se(ve)}else if(at===3||at===4)return ve.nodeValue}else for(;Pe=ve[Ot++];)Je+=se(Pe);return Je},K=Ar.selectors={cacheLength:50,createPseudo:qr,match:Re,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(ve){return ve[1]=ve[1].replace(rn,vr),ve[3]=(ve[3]||ve[4]||ve[5]||"").replace(rn,vr),ve[2]==="~="&&(ve[3]=" "+ve[3]+" "),ve.slice(0,4)},CHILD:function(ve){return ve[1]=ve[1].toLowerCase(),ve[1].slice(0,3)==="nth"?(ve[3]||Ar.error(ve[0]),ve[4]=+(ve[4]?ve[5]+(ve[6]||1):2*(ve[3]==="even"||ve[3]==="odd")),ve[5]=+(ve[7]+ve[8]||ve[3]==="odd")):ve[3]&&Ar.error(ve[0]),ve},PSEUDO:function(ve){var Pe,Je=!ve[6]&&ve[2];return Re.CHILD.test(ve[0])?null:(ve[3]?ve[2]=ve[4]||ve[5]||"":Je&&ne.test(Je)&&(Pe=he(Je,!0))&&(Pe=Je.indexOf(")",Je.length-Pe)-Je.length)&&(ve[0]=ve[0].slice(0,Pe),ve[2]=Je.slice(0,Pe)),ve.slice(0,3))}},filter:{TAG:function(ve){var Pe=ve.replace(rn,vr).toLowerCase();return ve==="*"?function(){return!0}:function(Je){return Je.nodeName&&Je.nodeName.toLowerCase()===Pe}},CLASS:function(ve){var Pe=Ee[ve+" "];return Pe||(Pe=new RegExp("(^|"+kn+")"+ve+"("+kn+"|$)"))&&Ee(ve,function(Je){return Pe.test(typeof Je.className=="string"&&Je.className||typeof Je.getAttribute!="undefined"&&Je.getAttribute("class")||"")})},ATTR:function(ve,Pe,Je){return function(Ot){var at=Ar.attr(Ot,ve);return at==null?Pe==="!=":Pe?(at+="",Pe==="="?at===Je:Pe==="!="?at!==Je:Pe==="^="?Je&&at.indexOf(Je)===0:Pe==="*="?Je&&at.indexOf(Je)>-1:Pe==="$="?Je&&at.slice(-Je.length)===Je:Pe==="~="?(" "+at.replace(ei," ")+" ").indexOf(Je)>-1:Pe==="|="?at===Je||at.slice(0,Je.length+1)===Je+"-":!1):!0}},CHILD:function(ve,Pe,Je,Ot,at){var Wt=ve.slice(0,3)!=="nth",Vt=ve.slice(-4)!=="last",nn=Pe==="of-type";return Ot===1&&at===0?function(cn){return!!cn.parentNode}:function(cn,Fn,In){var Bn,Hn,_r,Tn,ti,wi,qi=Wt!==Vt?"nextSibling":"previousSibling",zr=cn.parentNode,Fo=nn&&cn.nodeName.toLowerCase(),Go=!In&&!nn,no=!1;if(zr){if(Wt){for(;qi;){for(Tn=cn;Tn=Tn[qi];)if(nn?Tn.nodeName.toLowerCase()===Fo:Tn.nodeType===1)return!1;wi=qi=ve==="only"&&!wi&&"nextSibling"}return!0}if(wi=[Vt?zr.firstChild:zr.lastChild],Vt&&Go){for(Tn=zr,_r=Tn[q]||(Tn[q]={}),Hn=_r[Tn.uniqueID]||(_r[Tn.uniqueID]={}),Bn=Hn[ve]||[],ti=Bn[0]===ge&&Bn[1],no=ti&&Bn[2],Tn=ti&&zr.childNodes[ti];Tn=++ti&&Tn&&Tn[qi]||(no=ti=0)||wi.pop();)if(Tn.nodeType===1&&++no&&Tn===cn){Hn[ve]=[ge,ti,no];break}}else if(Go&&(Tn=cn,_r=Tn[q]||(Tn[q]={}),Hn=_r[Tn.uniqueID]||(_r[Tn.uniqueID]={}),Bn=Hn[ve]||[],ti=Bn[0]===ge&&Bn[1],no=ti),no===!1)for(;(Tn=++ti&&Tn&&Tn[qi]||(no=ti=0)||wi.pop())&&!((nn?Tn.nodeName.toLowerCase()===Fo:Tn.nodeType===1)&&++no&&(Go&&(_r=Tn[q]||(Tn[q]={}),Hn=_r[Tn.uniqueID]||(_r[Tn.uniqueID]={}),Hn[ve]=[ge,no]),Tn===cn)););return no-=at,no===Ot||no%Ot==0&&no/Ot>=0}}},PSEUDO:function(ve,Pe){var Je,Ot=K.pseudos[ve]||K.setFilters[ve.toLowerCase()]||Ar.error("unsupported pseudo: "+ve);return Ot[q]?Ot(Pe):Ot.length>1?(Je=[ve,ve,"",Pe],K.setFilters.hasOwnProperty(ve.toLowerCase())?qr(function(at,Wt){for(var Vt,nn=Ot(at,Pe),cn=nn.length;cn--;)Vt=qn(at,nn[cn]),at[Vt]=!(Wt[Vt]=nn[cn])}):function(at){return Ot(at,0,Je)}):Ot}},pseudos:{not:qr(function(ve){var Pe=[],Je=[],Ot=He(ve.replace(Sr,"$1"));return Ot[q]?qr(function(at,Wt,Vt,nn){for(var cn,Fn=Ot(at,null,nn,[]),In=at.length;In--;)(cn=Fn[In])&&(at[In]=!(Wt[In]=cn))}):function(at,Wt,Vt){return Pe[0]=at,Ot(Pe,null,Vt,Je),Pe[0]=null,!Je.pop()}}),has:qr(function(ve){return function(Pe){return Ar(ve,Pe).length>0}}),contains:qr(function(ve){return ve=ve.replace(rn,vr),function(Pe){return(Pe.textContent||se(Pe)).indexOf(ve)>-1}}),lang:qr(function(ve){return ue.test(ve||"")||Ar.error("unsupported lang: "+ve),ve=ve.replace(rn,vr).toLowerCase(),function(Pe){var Je;do if(Je=w?Pe.lang:Pe.getAttribute("xml:lang")||Pe.getAttribute("lang"))return Je=Je.toLowerCase(),Je===ve||Je.indexOf(ve+"-")===0;while((Pe=Pe.parentNode)&&Pe.nodeType===1);return!1}}),target:function(ve){var Pe=A.location&&A.location.hash;return Pe&&Pe.slice(1)===ve.id},root:function(ve){return ve===vn},focus:function(ve){return ve===bt.activeElement&&(!bt.hasFocus||bt.hasFocus())&&!!(ve.type||ve.href||~ve.tabIndex)},enabled:Pi(!1),disabled:Pi(!0),checked:function(ve){var Pe=ve.nodeName.toLowerCase();return Pe==="input"&&!!ve.checked||Pe==="option"&&!!ve.selected},selected:function(ve){return ve.parentNode&&ve.parentNode.selectedIndex,ve.selected===!0},empty:function(ve){for(ve=ve.firstChild;ve;ve=ve.nextSibling)if(ve.nodeType<6)return!1;return!0},parent:function(ve){return!K.pseudos.empty(ve)},header:function(ve){return Qe.test(ve.nodeName)},input:function(ve){return rt.test(ve.nodeName)},button:function(ve){var Pe=ve.nodeName.toLowerCase();return Pe==="input"&&ve.type==="button"||Pe==="button"},text:function(ve){var Pe;return ve.nodeName.toLowerCase()==="input"&&ve.type==="text"&&((Pe=ve.getAttribute("type"))==null||Pe.toLowerCase()==="text")},first:Wn(function(){return[0]}),last:Wn(function(ve,Pe){return[Pe-1]}),eq:Wn(function(ve,Pe,Je){return[Je<0?Je+Pe:Je]}),even:Wn(function(ve,Pe){for(var Je=0;JePe?Pe:Je;--Ot>=0;)ve.push(Ot);return ve}),gt:Wn(function(ve,Pe,Je){for(var Ot=Je<0?Je+Pe:Je;++Ot1?function(Pe,Je,Ot){for(var at=ve.length;at--;)if(!ve[at](Pe,Je,Ot))return!1;return!0}:ve[0]}c(jo,"elementMatcher");function xa(ve,Pe,Je){for(var Ot=0,at=Pe.length;Ot-1&&(Vt[In]=!(nn[In]=Hn))}}else zr=Eo(zr===nn?zr.splice(ti,zr.length):zr),at?at(null,nn,zr,Fn):xn.apply(nn,zr)})}c(bs,"setMatcher");function ws(ve){for(var Pe,Je,Ot,at=ve.length,Wt=K.relative[ve[0].type],Vt=Wt||K.relative[" "],nn=Wt?1:0,cn=bo(function(Bn){return Bn===Pe},Vt,!0),Fn=bo(function(Bn){return qn(Pe,Bn)>-1},Vt,!0),In=[function(Bn,Hn,_r){var Tn=!Wt&&(_r||Hn!==st)||((Pe=Hn).nodeType?cn(Bn,Hn,_r):Fn(Bn,Hn,_r));return Pe=null,Tn}];nn1&&jo(In),nn>1&&Ko(ve.slice(0,nn-1).concat({value:ve[nn-2].type===" "?"*":""})).replace(Sr,"$1"),Je,nn0,Ot=ve.length>0,at=c(function(Wt,Vt,nn,cn,Fn){var In,Bn,Hn,_r=0,Tn="0",ti=Wt&&[],wi=[],qi=st,zr=Wt||Ot&&K.find.TAG("*",Fn),Fo=ge+=qi==null?1:Math.random()||.1,Go=zr.length;for(Fn&&(st=Vt==bt||Vt||Fn);Tn!==Go&&(In=zr[Tn])!=null;Tn++){if(Ot&&In){for(Bn=0,!Vt&&In.ownerDocument!=bt&&(gt(In),nn=!w);Hn=ve[Bn++];)if(Hn(In,Vt||bt,nn)){cn.push(In);break}Fn&&(ge=Fo)}Je&&((In=!Hn&&In)&&_r--,Wt&&ti.push(In))}if(_r+=Tn,Je&&Tn!==_r){for(Bn=0;Hn=Pe[Bn++];)Hn(ti,wi,Vt,nn);if(Wt){if(_r>0)for(;Tn--;)ti[Tn]||wi[Tn]||(wi[Tn]=zt.call(cn));wi=Eo(wi)}xn.apply(cn,wi),Fn&&!Wt&&wi.length>0&&_r+Pe.length>1&&Ar.uniqueSort(cn)}return Fn&&(ge=Fo,st=qi),ti},"superMatcher");return Je?qr(at):at}return c(Ls,"matcherFromGroupMatchers"),He=Ar.compile=function(ve,Pe){var Je,Ot=[],at=[],Wt=it[ve+" "];if(!Wt){for(Pe||(Pe=he(ve)),Je=Pe.length;Je--;)Wt=ws(Pe[Je]),Wt[q]?Ot.push(Wt):at.push(Wt);Wt=it(ve,Ls(at,Ot)),Wt.selector=ve}return Wt},Fe=Ar.select=function(ve,Pe,Je,Ot){var at,Wt,Vt,nn,cn,Fn=typeof ve=="function"&&ve,In=!Ot&&he(ve=Fn.selector||ve);if(Je=Je||[],In.length===1){if(Wt=In[0]=In[0].slice(0),Wt.length>2&&(Vt=Wt[0]).type==="ID"&&Pe.nodeType===9&&w&&K.relative[Wt[1].type]){if(Pe=(K.find.ID(Vt.matches[0].replace(rn,vr),Pe)||[])[0],Pe)Fn&&(Pe=Pe.parentNode);else return Je;ve=ve.slice(Wt.shift().value.length)}for(at=Re.needsContext.test(ve)?0:Wt.length;at--&&(Vt=Wt[at],!K.relative[nn=Vt.type]);)if((cn=K.find[nn])&&(Ot=cn(Vt.matches[0].replace(rn,vr),Nn.test(Wt[0].type)&&ys(Pe.parentNode)||Pe))){if(Wt.splice(at,1),ve=Ot.length&&Ko(Wt),!ve)return xn.apply(Je,Ot),Je;break}}return(Fn||He(ve,In))(Ot,Pe,!w,Je,!Pe||Nn.test(ve)&&ys(Pe.parentNode)||Pe),Je},j.sortStable=q.split("").sort(Ct).join("")===q,j.detectDuplicates=!!Ht,gt(),j.sortDetached=to(function(ve){return ve.compareDocumentPosition(bt.createElement("fieldset"))&1}),to(function(ve){return ve.innerHTML="",ve.firstChild.getAttribute("href")==="#"})||So("type|href|height|width",function(ve,Pe,Je){if(!Je)return ve.getAttribute(Pe,Pe.toLowerCase()==="type"?1:2)}),(!j.attributes||!to(function(ve){return ve.innerHTML="",ve.firstChild.setAttribute("value",""),ve.firstChild.getAttribute("value")===""}))&&So("value",function(ve,Pe,Je){if(!Je&&ve.nodeName.toLowerCase()==="input")return ve.defaultValue}),to(function(ve){return ve.getAttribute("disabled")==null})||So(Mr,function(ve,Pe,Je){var Ot;if(!Je)return ve[Pe]===!0?Pe.toLowerCase():(Ot=ve.getAttributeNode(Pe))&&Ot.specified?Ot.value:null}),Ar}(h);g.find=S,g.expr=S.selectors,g.expr[":"]=g.expr.pseudos,g.uniqueSort=g.unique=S.uniqueSort,g.text=S.getText,g.isXMLDoc=S.isXML,g.contains=S.contains,g.escapeSelector=S.escape;var L=c(function(A,B,j){for(var K=[],se=j!==void 0;(A=A[B])&&A.nodeType!==9;)if(A.nodeType===1){if(se&&g(A).is(j))break;K.push(A)}return K},"dir"),C=c(function(A,B){for(var j=[];A;A=A.nextSibling)A.nodeType===1&&A!==B&&j.push(A);return j},"siblings"),M=g.expr.match.needsContext;function D(A,B){return A.nodeName&&A.nodeName.toLowerCase()===B.toLowerCase()}c(D,"nodeName");var P=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function U(A,B,j){return f(B)?g.grep(A,function(K,se){return!!B.call(K,se,K)!==j}):B.nodeType?g.grep(A,function(K){return K===B!==j}):typeof B!="string"?g.grep(A,function(K){return s.call(B,K)>-1!==j}):g.filter(B,A,j)}c(U,"winnow"),g.filter=function(A,B,j){var K=B[0];return j&&(A=":not("+A+")"),B.length===1&&K.nodeType===1?g.find.matchesSelector(K,A)?[K]:[]:g.find.matches(A,g.grep(B,function(se){return se.nodeType===1}))},g.fn.extend({find:function(A){var B,j,K=this.length,se=this;if(typeof A!="string")return this.pushStack(g(A).filter(function(){for(B=0;B1?g.uniqueSort(j):j},filter:function(A){return this.pushStack(U(this,A||[],!1))},not:function(A){return this.pushStack(U(this,A||[],!0))},is:function(A){return!!U(this,typeof A=="string"&&M.test(A)?g(A):A||[],!1).length}});var ee,le=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,fe=g.fn.init=function(A,B,j){var K,se;if(!A)return this;if(j=j||ee,typeof A=="string")if(A[0]==="<"&&A[A.length-1]===">"&&A.length>=3?K=[null,A,null]:K=le.exec(A),K&&(K[1]||!B))if(K[1]){if(B=B instanceof g?B[0]:B,g.merge(this,g.parseHTML(K[1],B&&B.nodeType?B.ownerDocument||B:l,!0)),P.test(K[1])&&g.isPlainObject(B))for(K in B)f(this[K])?this[K](B[K]):this.attr(K,B[K]);return this}else return se=l.getElementById(K[2]),se&&(this[0]=se,this.length=1),this;else return!B||B.jquery?(B||j).find(A):this.constructor(B).find(A);else{if(A.nodeType)return this[0]=A,this.length=1,this;if(f(A))return j.ready!==void 0?j.ready(A):A(g)}return g.makeArray(A,this)};fe.prototype=g.fn,ee=g(l);var be=/^(?:parents|prev(?:Until|All))/,ce={children:!0,contents:!0,next:!0,prev:!0};g.fn.extend({has:function(A){var B=g(A,this),j=B.length;return this.filter(function(){for(var K=0;K-1:j.nodeType===1&&g.find.matchesSelector(j,A))){ae.push(j);break}}return this.pushStack(ae.length>1?g.uniqueSort(ae):ae)},index:function(A){return A?typeof A=="string"?s.call(g(A),this[0]):s.call(this,A.jquery?A[0]:A):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(A,B){return this.pushStack(g.uniqueSort(g.merge(this.get(),g(A,B))))},addBack:function(A){return this.add(A==null?this.prevObject:this.prevObject.filter(A))}});function re(A,B){for(;(A=A[B])&&A.nodeType!==1;);return A}c(re,"sibling"),g.each({parent:function(A){var B=A.parentNode;return B&&B.nodeType!==11?B:null},parents:function(A){return L(A,"parentNode")},parentsUntil:function(A,B,j){return L(A,"parentNode",j)},next:function(A){return re(A,"nextSibling")},prev:function(A){return re(A,"previousSibling")},nextAll:function(A){return L(A,"nextSibling")},prevAll:function(A){return L(A,"previousSibling")},nextUntil:function(A,B,j){return L(A,"nextSibling",j)},prevUntil:function(A,B,j){return L(A,"previousSibling",j)},siblings:function(A){return C((A.parentNode||{}).firstChild,A)},children:function(A){return C(A.firstChild)},contents:function(A){return A.contentDocument!=null&&T(A.contentDocument)?A.contentDocument:(D(A,"template")&&(A=A.content||A),g.merge([],A.childNodes))}},function(A,B){g.fn[A]=function(j,K){var se=g.map(this,B,j);return A.slice(-5)!=="Until"&&(K=j),K&&typeof K=="string"&&(se=g.filter(K,se)),this.length>1&&(ce[A]||g.uniqueSort(se),be.test(A)&&se.reverse()),this.pushStack(se)}});var me=/[^\x20\t\r\n\f]+/g;function ye(A){var B={};return g.each(A.match(me)||[],function(j,K){B[K]=!0}),B}c(ye,"createOptions"),g.Callbacks=function(A){A=typeof A=="string"?ye(A):g.extend({},A);var B,j,K,se,ae=[],he=[],He=-1,Fe=c(function(){for(se=se||A.once,K=B=!0;he.length;He=-1)for(j=he.shift();++He-1;)ae.splice(gt,1),gt<=He&&He--}),this},has:function(vt){return vt?g.inArray(vt,ae)>-1:ae.length>0},empty:function(){return ae&&(ae=[]),this},disable:function(){return se=he=[],ae=j="",this},disabled:function(){return!ae},lock:function(){return se=he=[],!j&&!B&&(ae=j=""),this},locked:function(){return!!se},fireWith:function(vt,Ht){return se||(Ht=Ht||[],Ht=[vt,Ht.slice?Ht.slice():Ht],he.push(Ht),B||Fe()),this},fire:function(){return st.fireWith(this,arguments),this},fired:function(){return!!K}};return st};function We(A){return A}c(We,"Identity");function Ve(A){throw A}c(Ve,"Thrower");function _e(A,B,j,K){var se;try{A&&f(se=A.promise)?se.call(A).done(B).fail(j):A&&f(se=A.then)?se.call(A,B,j):B.apply(void 0,[A].slice(K))}catch(ae){j.apply(void 0,[ae])}}c(_e,"adoptValue"),g.extend({Deferred:function(A){var B=[["notify","progress",g.Callbacks("memory"),g.Callbacks("memory"),2],["resolve","done",g.Callbacks("once memory"),g.Callbacks("once memory"),0,"resolved"],["reject","fail",g.Callbacks("once memory"),g.Callbacks("once memory"),1,"rejected"]],j="pending",K={state:function(){return j},always:function(){return se.done(arguments).fail(arguments),this},catch:function(ae){return K.then(null,ae)},pipe:function(){var ae=arguments;return g.Deferred(function(he){g.each(B,function(He,Fe){var st=f(ae[Fe[4]])&&ae[Fe[4]];se[Fe[1]](function(){var vt=st&&st.apply(this,arguments);vt&&f(vt.promise)?vt.promise().progress(he.notify).done(he.resolve).fail(he.reject):he[Fe[0]+"With"](this,st?[vt]:arguments)})}),ae=null}).promise()},then:function(ae,he,He){var Fe=0;function st(vt,Ht,gt,bt){return function(){var vn=this,w=arguments,F=c(function(){var W,z;if(!(vt=Fe&&(gt!==Ve&&(vn=void 0,w=[W]),Ht.rejectWith(vn,w))}};vt?O():(g.Deferred.getStackHook&&(O.stackTrace=g.Deferred.getStackHook()),h.setTimeout(O))}}return c(st,"resolve"),g.Deferred(function(vt){B[0][3].add(st(0,vt,f(He)?He:We,vt.notifyWith)),B[1][3].add(st(0,vt,f(ae)?ae:We)),B[2][3].add(st(0,vt,f(he)?he:Ve))}).promise()},promise:function(ae){return ae!=null?g.extend(ae,K):K}},se={};return g.each(B,function(ae,he){var He=he[2],Fe=he[5];K[he[1]]=He.add,Fe&&He.add(function(){j=Fe},B[3-ae][2].disable,B[3-ae][3].disable,B[0][2].lock,B[0][3].lock),He.add(he[3].fire),se[he[0]]=function(){return se[he[0]+"With"](this===se?void 0:this,arguments),this},se[he[0]+"With"]=He.fireWith}),K.promise(se),A&&A.call(se,se),se},when:function(A){var B=arguments.length,j=B,K=Array(j),se=m.call(arguments),ae=g.Deferred(),he=c(function(He){return function(Fe){K[He]=this,se[He]=arguments.length>1?m.call(arguments):Fe,--B||ae.resolveWith(K,se)}},"updateFunc");if(B<=1&&(_e(A,ae.done(he(j)).resolve,ae.reject,!B),ae.state()==="pending"||f(se[j]&&se[j].then)))return ae.then();for(;j--;)_e(se[j],he(j),ae.reject);return ae.promise()}});var Ue=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;g.Deferred.exceptionHook=function(A,B){h.console&&h.console.warn&&A&&Ue.test(A.name)&&h.console.warn("jQuery.Deferred exception: "+A.message,A.stack,B)},g.readyException=function(A){h.setTimeout(function(){throw A})};var pe=g.Deferred();g.fn.ready=function(A){return pe.then(A).catch(function(B){g.readyException(B)}),this},g.extend({isReady:!1,readyWait:1,ready:function(A){(A===!0?--g.readyWait:g.isReady)||(g.isReady=!0,!(A!==!0&&--g.readyWait>0)&&pe.resolveWith(l,[g]))}}),g.ready.then=pe.then;function ct(){l.removeEventListener("DOMContentLoaded",ct),h.removeEventListener("load",ct),g.ready()}c(ct,"completed"),l.readyState==="complete"||l.readyState!=="loading"&&!l.documentElement.doScroll?h.setTimeout(g.ready):(l.addEventListener("DOMContentLoaded",ct),h.addEventListener("load",ct));var je=c(function(A,B,j,K,se,ae,he){var He=0,Fe=A.length,st=j==null;if(b(j)==="object"){se=!0;for(He in j)je(A,B,He,j[He],!0,ae,he)}else if(K!==void 0&&(se=!0,f(K)||(he=!0),st&&(he?(B.call(A,K),B=null):(st=B,B=c(function(vt,Ht,gt){return st.call(g(vt),gt)},"fn"))),B))for(;He1,null,!0)},removeData:function(A){return this.each(function(){$e.remove(this,A)})}}),g.extend({queue:function(A,B,j){var K;if(A)return B=(B||"fx")+"queue",K=ke.get(A,B),j&&(!K||Array.isArray(j)?K=ke.access(A,B,g.makeArray(j)):K.push(j)),K||[]},dequeue:function(A,B){B=B||"fx";var j=g.queue(A,B),K=j.length,se=j.shift(),ae=g._queueHooks(A,B),he=c(function(){g.dequeue(A,B)},"next");se==="inprogress"&&(se=j.shift(),K--),se&&(B==="fx"&&j.unshift("inprogress"),delete ae.stop,se.call(A,he,ae)),!K&&ae&&ae.empty.fire()},_queueHooks:function(A,B){var j=B+"queueHooks";return ke.get(A,j)||ke.access(A,j,{empty:g.Callbacks("once memory").add(function(){ke.remove(A,[B+"queue",j])})})}}),g.fn.extend({queue:function(A,B){var j=2;return typeof A!="string"&&(B=A,A="fx",j--),arguments.length\x20\t\r\n\f]*)/i,mn=/^$|^module$|\/(?:java|ecma)script/i;(function(){var A=l.createDocumentFragment(),B=A.appendChild(l.createElement("div")),j=l.createElement("input");j.setAttribute("type","radio"),j.setAttribute("checked","checked"),j.setAttribute("name","t"),B.appendChild(j),d.checkClone=B.cloneNode(!0).cloneNode(!0).lastChild.checked,B.innerHTML="",d.noCloneChecked=!!B.cloneNode(!0).lastChild.defaultValue,B.innerHTML="",d.option=!!B.lastChild})();var Un={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Un.tbody=Un.tfoot=Un.colgroup=Un.caption=Un.thead,Un.th=Un.td,d.option||(Un.optgroup=Un.option=[1,""]);function On(A,B){var j;return typeof A.getElementsByTagName!="undefined"?j=A.getElementsByTagName(B||"*"):typeof A.querySelectorAll!="undefined"?j=A.querySelectorAll(B||"*"):j=[],B===void 0||B&&D(A,B)?g.merge([A],j):j}c(On,"getAll");function dn(A,B){for(var j=0,K=A.length;j-1){se&&se.push(ae);continue}if(st=Et(ae),he=On(Ht.appendChild(ae),"script"),st&&dn(he),j)for(vt=0;ae=he[vt++];)mn.test(ae.type||"")&&j.push(ae)}return Ht}c(mr,"buildFragment");var ur=/^([^.]*)(?:\.(.+)|)/;function Qn(){return!0}c(Qn,"returnTrue");function $r(){return!1}c($r,"returnFalse");function hr(A,B){return A===Fr()==(B==="focus")}c(hr,"expectSync");function Fr(){try{return l.activeElement}catch{}}c(Fr,"safeActiveElement");function tr(A,B,j,K,se,ae){var he,He;if(typeof B=="object"){typeof j!="string"&&(K=K||j,j=void 0);for(He in B)tr(A,He,j,K,B[He],ae);return A}if(K==null&&se==null?(se=j,K=j=void 0):se==null&&(typeof j=="string"?(se=K,K=void 0):(se=K,K=j,j=void 0)),se===!1)se=$r;else if(!se)return A;return ae===1&&(he=se,se=c(function(Fe){return g().off(Fe),he.apply(this,arguments)},"fn"),se.guid=he.guid||(he.guid=g.guid++)),A.each(function(){g.event.add(this,B,se,K,j)})}c(tr,"on"),g.event={global:{},add:function(A,B,j,K,se){var ae,he,He,Fe,st,vt,Ht,gt,bt,vn,w,F=ke.get(A);if(!!Be(A))for(j.handler&&(ae=j,j=ae.handler,se=ae.selector),se&&g.find.matchesSelector(en,se),j.guid||(j.guid=g.guid++),(Fe=F.events)||(Fe=F.events=Object.create(null)),(he=F.handle)||(he=F.handle=function(O){return typeof g!="undefined"&&g.event.triggered!==O.type?g.event.dispatch.apply(A,arguments):void 0}),B=(B||"").match(me)||[""],st=B.length;st--;)He=ur.exec(B[st])||[],bt=w=He[1],vn=(He[2]||"").split(".").sort(),!!bt&&(Ht=g.event.special[bt]||{},bt=(se?Ht.delegateType:Ht.bindType)||bt,Ht=g.event.special[bt]||{},vt=g.extend({type:bt,origType:w,data:K,handler:j,guid:j.guid,selector:se,needsContext:se&&g.expr.match.needsContext.test(se),namespace:vn.join(".")},ae),(gt=Fe[bt])||(gt=Fe[bt]=[],gt.delegateCount=0,(!Ht.setup||Ht.setup.call(A,K,vn,he)===!1)&&A.addEventListener&&A.addEventListener(bt,he)),Ht.add&&(Ht.add.call(A,vt),vt.handler.guid||(vt.handler.guid=j.guid)),se?gt.splice(gt.delegateCount++,0,vt):gt.push(vt),g.event.global[bt]=!0)},remove:function(A,B,j,K,se){var ae,he,He,Fe,st,vt,Ht,gt,bt,vn,w,F=ke.hasData(A)&&ke.get(A);if(!(!F||!(Fe=F.events))){for(B=(B||"").match(me)||[""],st=B.length;st--;){if(He=ur.exec(B[st])||[],bt=w=He[1],vn=(He[2]||"").split(".").sort(),!bt){for(bt in Fe)g.event.remove(A,bt+B[st],j,K,!0);continue}for(Ht=g.event.special[bt]||{},bt=(K?Ht.delegateType:Ht.bindType)||bt,gt=Fe[bt]||[],He=He[2]&&new RegExp("(^|\\.)"+vn.join("\\.(?:.*\\.|)")+"(\\.|$)"),he=ae=gt.length;ae--;)vt=gt[ae],(se||w===vt.origType)&&(!j||j.guid===vt.guid)&&(!He||He.test(vt.namespace))&&(!K||K===vt.selector||K==="**"&&vt.selector)&&(gt.splice(ae,1),vt.selector&>.delegateCount--,Ht.remove&&Ht.remove.call(A,vt));he&&!gt.length&&((!Ht.teardown||Ht.teardown.call(A,vn,F.handle)===!1)&&g.removeEvent(A,bt,F.handle),delete Fe[bt])}g.isEmptyObject(Fe)&&ke.remove(A,"handle events")}},dispatch:function(A){var B,j,K,se,ae,he,He=new Array(arguments.length),Fe=g.event.fix(A),st=(ke.get(this,"events")||Object.create(null))[Fe.type]||[],vt=g.event.special[Fe.type]||{};for(He[0]=Fe,B=1;B=1)){for(;st!==this;st=st.parentNode||this)if(st.nodeType===1&&!(A.type==="click"&&st.disabled===!0)){for(ae=[],he={},j=0;j-1:g.find(se,this,null,[st]).length),he[se]&&ae.push(K);ae.length&&He.push({elem:st,handlers:ae})}}return st=this,Fe\s*$/g;function nr(A,B){return D(A,"table")&&D(B.nodeType!==11?B:B.firstChild,"tr")&&g(A).children("tbody")[0]||A}c(nr,"manipulationTarget");function Hr(A){return A.type=(A.getAttribute("type")!==null)+"/"+A.type,A}c(Hr,"disableScript");function Jn(A){return(A.type||"").slice(0,5)==="true/"?A.type=A.type.slice(5):A.removeAttribute("type"),A}c(Jn,"restoreScript");function br(A,B){var j,K,se,ae,he,He,Fe;if(B.nodeType===1){if(ke.hasData(A)&&(ae=ke.get(A),Fe=ae.events,Fe)){ke.remove(B,"handle events");for(se in Fe)for(j=0,K=Fe[se].length;j1&&typeof bt=="string"&&!d.checkClone&&po.test(bt))return A.each(function(w){var F=A.eq(w);vn&&(B[0]=bt.call(this,w,F.html())),Gr(F,B,j,K)});if(Ht&&(se=mr(B,A[0].ownerDocument,!1,A,K),ae=se.firstChild,se.childNodes.length===1&&(se=ae),ae||K)){for(he=g.map(On(se,"script"),Hr),He=he.length;vt0&&dn(he,!Fe&&On(A,"script")),He},cleanData:function(A){for(var B,j,K,se=g.event.special,ae=0;(j=A[ae])!==void 0;ae++)if(Be(j)){if(B=j[ke.expando]){if(B.events)for(K in B.events)se[K]?g.event.remove(j,K):g.removeEvent(j,K,B.handle);j[ke.expando]=void 0}j[$e.expando]&&(j[$e.expando]=void 0)}}}),g.fn.extend({detach:function(A){return kr(this,A,!0)},remove:function(A){return kr(this,A)},text:function(A){return je(this,function(B){return B===void 0?g.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=B)})},null,A,arguments.length)},append:function(){return Gr(this,arguments,function(A){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var B=nr(this,A);B.appendChild(A)}})},prepend:function(){return Gr(this,arguments,function(A){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var B=nr(this,A);B.insertBefore(A,B.firstChild)}})},before:function(){return Gr(this,arguments,function(A){this.parentNode&&this.parentNode.insertBefore(A,this)})},after:function(){return Gr(this,arguments,function(A){this.parentNode&&this.parentNode.insertBefore(A,this.nextSibling)})},empty:function(){for(var A,B=0;(A=this[B])!=null;B++)A.nodeType===1&&(g.cleanData(On(A,!1)),A.textContent="");return this},clone:function(A,B){return A=A??!1,B=B??A,this.map(function(){return g.clone(this,A,B)})},html:function(A){return je(this,function(B){var j=this[0]||{},K=0,se=this.length;if(B===void 0&&j.nodeType===1)return j.innerHTML;if(typeof B=="string"&&!ci.test(B)&&!Un[(Mn.exec(B)||["",""])[1].toLowerCase()]){B=g.htmlPrefilter(B);try{for(;K=0&&(Fe+=Math.max(0,Math.ceil(A["offset"+B[0].toUpperCase()+B.slice(1)]-ae-Fe-He-.5))||0),Fe}c(Ii,"boxModelAdjustment");function Oi(A,B,j){var K=oi(A),se=!d.boxSizingReliable()||j,ae=se&&g.css(A,"boxSizing",!1,K)==="border-box",he=ae,He=Ui(A,B,K),Fe="offset"+B[0].toUpperCase()+B.slice(1);if(xi.test(He)){if(!j)return He;He="auto"}return(!d.boxSizingReliable()&&ae||!d.reliableTrDimensions()&&D(A,"tr")||He==="auto"||!parseFloat(He)&&g.css(A,"display",!1,K)==="inline")&&A.getClientRects().length&&(ae=g.css(A,"boxSizing",!1,K)==="border-box",he=Fe in A,he&&(He=A[Fe])),He=parseFloat(He)||0,He+Ii(A,B,j||(ae?"border":"content"),he,K,He)+"px"}c(Oi,"getWidthOrHeight"),g.extend({cssHooks:{opacity:{get:function(A,B){if(B){var j=Ui(A,"opacity");return j===""?"1":j}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(A,B,j,K){if(!(!A||A.nodeType===3||A.nodeType===8||!A.style)){var se,ae,he,He=St(B),Fe=Ri.test(B),st=A.style;if(Fe||(B=si(He)),he=g.cssHooks[B]||g.cssHooks[He],j!==void 0){if(ae=typeof j,ae==="string"&&(se=Pt.exec(j))&&se[1]&&(j=_t(A,B,se),ae="number"),j==null||j!==j)return;ae==="number"&&!Fe&&(j+=se&&se[3]||(g.cssNumber[He]?"":"px")),!d.clearCloneStyle&&j===""&&B.indexOf("background")===0&&(st[B]="inherit"),(!he||!("set"in he)||(j=he.set(A,j,K))!==void 0)&&(Fe?st.setProperty(B,j):st[B]=j)}else return he&&"get"in he&&(se=he.get(A,!1,K))!==void 0?se:st[B]}},css:function(A,B,j,K){var se,ae,he,He=St(B),Fe=Ri.test(B);return Fe||(B=si(He)),he=g.cssHooks[B]||g.cssHooks[He],he&&"get"in he&&(se=he.get(A,!0,j)),se===void 0&&(se=Ui(A,B,K)),se==="normal"&&B in Ur&&(se=Ur[B]),j===""||j?(ae=parseFloat(se),j===!0||isFinite(ae)?ae||0:se):se}}),g.each(["height","width"],function(A,B){g.cssHooks[B]={get:function(j,K,se){if(K)return Ci.test(g.css(j,"display"))&&(!j.getClientRects().length||!j.getBoundingClientRect().width)?ji(j,jr,function(){return Oi(j,B,se)}):Oi(j,B,se)},set:function(j,K,se){var ae,he=oi(j),He=!d.scrollboxSize()&&he.position==="absolute",Fe=He||se,st=Fe&&g.css(j,"boxSizing",!1,he)==="border-box",vt=se?Ii(j,B,se,st,he):0;return st&&He&&(vt-=Math.ceil(j["offset"+B[0].toUpperCase()+B.slice(1)]-parseFloat(he[B])-Ii(j,B,"border",!1,he)-.5)),vt&&(ae=Pt.exec(K))&&(ae[3]||"px")!=="px"&&(j.style[B]=K,K=g.css(j,B)),Cr(j,K,vt)}}}),g.cssHooks.marginLeft=Fi(d.reliableMarginLeft,function(A,B){if(B)return(parseFloat(Ui(A,"marginLeft"))||A.getBoundingClientRect().left-ji(A,{marginLeft:0},function(){return A.getBoundingClientRect().left}))+"px"}),g.each({margin:"",padding:"",border:"Width"},function(A,B){g.cssHooks[A+B]={expand:function(j){for(var K=0,se={},ae=typeof j=="string"?j.split(" "):[j];K<4;K++)se[A+Bt[K]+B]=ae[K]||ae[K-2]||ae[0];return se}},A!=="margin"&&(g.cssHooks[A+B].set=Cr)}),g.fn.extend({css:function(A,B){return je(this,function(j,K,se){var ae,he,He={},Fe=0;if(Array.isArray(K)){for(ae=oi(j),he=K.length;Fe1)}});function ar(A,B,j,K,se){return new ar.prototype.init(A,B,j,K,se)}c(ar,"Tween"),g.Tween=ar,ar.prototype={constructor:ar,init:function(A,B,j,K,se,ae){this.elem=A,this.prop=j,this.easing=se||g.easing._default,this.options=B,this.start=this.now=this.cur(),this.end=K,this.unit=ae||(g.cssNumber[j]?"":"px")},cur:function(){var A=ar.propHooks[this.prop];return A&&A.get?A.get(this):ar.propHooks._default.get(this)},run:function(A){var B,j=ar.propHooks[this.prop];return this.options.duration?this.pos=B=g.easing[this.easing](A,this.options.duration*A,0,1,this.options.duration):this.pos=B=A,this.now=(this.end-this.start)*B+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),j&&j.set?j.set(this):ar.propHooks._default.set(this),this}},ar.prototype.init.prototype=ar.prototype,ar.propHooks={_default:{get:function(A){var B;return A.elem.nodeType!==1||A.elem[A.prop]!=null&&A.elem.style[A.prop]==null?A.elem[A.prop]:(B=g.css(A.elem,A.prop,""),!B||B==="auto"?0:B)},set:function(A){g.fx.step[A.prop]?g.fx.step[A.prop](A):A.elem.nodeType===1&&(g.cssHooks[A.prop]||A.elem.style[si(A.prop)]!=null)?g.style(A.elem,A.prop,A.now+A.unit):A.elem[A.prop]=A.now}}},ar.propHooks.scrollTop=ar.propHooks.scrollLeft={set:function(A){A.elem.nodeType&&A.elem.parentNode&&(A.elem[A.prop]=A.now)}},g.easing={linear:function(A){return A},swing:function(A){return .5-Math.cos(A*Math.PI)/2},_default:"swing"},g.fx=ar.prototype.init,g.fx.step={};var $i,Di,Vi=/^(?:toggle|show|hide)$/,ro=/queueHooks$/;function Si(){Di&&(l.hidden===!1&&h.requestAnimationFrame?h.requestAnimationFrame(Si):h.setTimeout(Si,g.fx.interval),g.fx.tick())}c(Si,"schedule");function Qr(){return h.setTimeout(function(){$i=void 0}),$i=Date.now()}c(Qr,"createFxNow");function Bi(A,B){var j,K=0,se={height:A};for(B=B?1:0;K<4;K+=2-B)j=Bt[K],se["margin"+j]=se["padding"+j]=A;return B&&(se.opacity=se.width=A),se}c(Bi,"genFx");function ri(A,B,j){for(var K,se=(Zr.tweeners[B]||[]).concat(Zr.tweeners["*"]),ae=0,he=se.length;ae1)},removeAttr:function(A){return this.each(function(){g.removeAttr(this,A)})}}),g.extend({attr:function(A,B,j){var K,se,ae=A.nodeType;if(!(ae===3||ae===8||ae===2)){if(typeof A.getAttribute=="undefined")return g.prop(A,B,j);if((ae!==1||!g.isXMLDoc(A))&&(se=g.attrHooks[B.toLowerCase()]||(g.expr.match.bool.test(B)?oo:void 0)),j!==void 0){if(j===null){g.removeAttr(A,B);return}return se&&"set"in se&&(K=se.set(A,j,B))!==void 0?K:(A.setAttribute(B,j+""),j)}return se&&"get"in se&&(K=se.get(A,B))!==null?K:(K=g.find.attr(A,B),K??void 0)}},attrHooks:{type:{set:function(A,B){if(!d.radioValue&&B==="radio"&&D(A,"input")){var j=A.value;return A.setAttribute("type",B),j&&(A.value=j),B}}}},removeAttr:function(A,B){var j,K=0,se=B&&B.match(me);if(se&&A.nodeType===1)for(;j=se[K++];)A.removeAttribute(j)}}),oo={set:function(A,B,j){return B===!1?g.removeAttr(A,j):A.setAttribute(j,j),j}},g.each(g.expr.match.bool.source.match(/\w+/g),function(A,B){var j=gr[B]||g.find.attr;gr[B]=function(K,se,ae){var he,He,Fe=se.toLowerCase();return ae||(He=gr[Fe],gr[Fe]=he,he=j(K,se,ae)!=null?Fe:null,gr[Fe]=He),he}});var Pn=/^(?:input|select|textarea|button)$/i,vo=/^(?:a|area)$/i;g.fn.extend({prop:function(A,B){return je(this,g.prop,A,B,arguments.length>1)},removeProp:function(A){return this.each(function(){delete this[g.propFix[A]||A]})}}),g.extend({prop:function(A,B,j){var K,se,ae=A.nodeType;if(!(ae===3||ae===8||ae===2))return(ae!==1||!g.isXMLDoc(A))&&(B=g.propFix[B]||B,se=g.propHooks[B]),j!==void 0?se&&"set"in se&&(K=se.set(A,j,B))!==void 0?K:A[B]=j:se&&"get"in se&&(K=se.get(A,B))!==null?K:A[B]},propHooks:{tabIndex:{get:function(A){var B=g.find.attr(A,"tabindex");return B?parseInt(B,10):Pn.test(A.nodeName)||vo.test(A.nodeName)&&A.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),d.optSelected||(g.propHooks.selected={get:function(A){var B=A.parentNode;return B&&B.parentNode&&B.parentNode.selectedIndex,null},set:function(A){var B=A.parentNode;B&&(B.selectedIndex,B.parentNode&&B.parentNode.selectedIndex)}}),g.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){g.propFix[this.toLowerCase()]=this});function Ir(A){var B=A.match(me)||[];return B.join(" ")}c(Ir,"stripAndCollapse");function yi(A){return A.getAttribute&&A.getAttribute("class")||""}c(yi,"getClass");function Zi(A){return Array.isArray(A)?A:typeof A=="string"?A.match(me)||[]:[]}c(Zi,"classesToArray"),g.fn.extend({addClass:function(A){var B,j,K,se,ae,he;return f(A)?this.each(function(He){g(this).addClass(A.call(this,He,yi(this)))}):(B=Zi(A),B.length?this.each(function(){if(K=yi(this),j=this.nodeType===1&&" "+Ir(K)+" ",j){for(ae=0;ae-1;)j=j.replace(" "+se+" "," ");he=Ir(j),K!==he&&this.setAttribute("class",he)}}):this):this.attr("class","")},toggleClass:function(A,B){var j,K,se,ae,he=typeof A,He=he==="string"||Array.isArray(A);return f(A)?this.each(function(Fe){g(this).toggleClass(A.call(this,Fe,yi(this),B),B)}):typeof B=="boolean"&&He?B?this.addClass(A):this.removeClass(A):(j=Zi(A),this.each(function(){if(He)for(ae=g(this),se=0;se-1)return!0;return!1}});var so=/\r/g;g.fn.extend({val:function(A){var B,j,K,se=this[0];return arguments.length?(K=f(A),this.each(function(ae){var he;this.nodeType===1&&(K?he=A.call(this,ae,g(this).val()):he=A,he==null?he="":typeof he=="number"?he+="":Array.isArray(he)&&(he=g.map(he,function(He){return He==null?"":He+""})),B=g.valHooks[this.type]||g.valHooks[this.nodeName.toLowerCase()],(!B||!("set"in B)||B.set(this,he,"value")===void 0)&&(this.value=he))})):se?(B=g.valHooks[se.type]||g.valHooks[se.nodeName.toLowerCase()],B&&"get"in B&&(j=B.get(se,"value"))!==void 0?j:(j=se.value,typeof j=="string"?j.replace(so,""):j??"")):void 0}}),g.extend({valHooks:{option:{get:function(A){var B=g.find.attr(A,"value");return B??Ir(g.text(A))}},select:{get:function(A){var B,j,K,se=A.options,ae=A.selectedIndex,he=A.type==="select-one",He=he?null:[],Fe=he?ae+1:se.length;for(ae<0?K=Fe:K=he?ae:0;K-1)&&(j=!0);return j||(A.selectedIndex=-1),ae}}}}),g.each(["radio","checkbox"],function(){g.valHooks[this]={set:function(A,B){if(Array.isArray(B))return A.checked=g.inArray(g(A).val(),B)>-1}},d.checkOn||(g.valHooks[this].get=function(A){return A.getAttribute("value")===null?"on":A.value})}),d.focusin="onfocusin"in h;var ai=/^(?:focusinfocus|focusoutblur)$/,J=c(function(A){A.stopPropagation()},"stopPropagationCallback");g.extend(g.event,{trigger:function(A,B,j,K){var se,ae,he,He,Fe,st,vt,Ht,gt=[j||l],bt=n.call(A,"type")?A.type:A,vn=n.call(A,"namespace")?A.namespace.split("."):[];if(ae=Ht=he=j=j||l,!(j.nodeType===3||j.nodeType===8)&&!ai.test(bt+g.event.triggered)&&(bt.indexOf(".")>-1&&(vn=bt.split("."),bt=vn.shift(),vn.sort()),Fe=bt.indexOf(":")<0&&"on"+bt,A=A[g.expando]?A:new g.Event(bt,typeof A=="object"&&A),A.isTrigger=K?2:3,A.namespace=vn.join("."),A.rnamespace=A.namespace?new RegExp("(^|\\.)"+vn.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,A.result=void 0,A.target||(A.target=j),B=B==null?[A]:g.makeArray(B,[A]),vt=g.event.special[bt]||{},!(!K&&vt.trigger&&vt.trigger.apply(j,B)===!1))){if(!K&&!vt.noBubble&&!p(j)){for(He=vt.delegateType||bt,ai.test(He+bt)||(ae=ae.parentNode);ae;ae=ae.parentNode)gt.push(ae),he=ae;he===(j.ownerDocument||l)&>.push(he.defaultView||he.parentWindow||h)}for(se=0;(ae=gt[se++])&&!A.isPropagationStopped();)Ht=ae,A.type=se>1?He:vt.bindType||bt,st=(ke.get(ae,"events")||Object.create(null))[A.type]&&ke.get(ae,"handle"),st&&st.apply(ae,B),st=Fe&&ae[Fe],st&&st.apply&&Be(ae)&&(A.result=st.apply(ae,B),A.result===!1&&A.preventDefault());return A.type=bt,!K&&!A.isDefaultPrevented()&&(!vt._default||vt._default.apply(gt.pop(),B)===!1)&&Be(j)&&Fe&&f(j[bt])&&!p(j)&&(he=j[Fe],he&&(j[Fe]=null),g.event.triggered=bt,A.isPropagationStopped()&&Ht.addEventListener(bt,J),j[bt](),A.isPropagationStopped()&&Ht.removeEventListener(bt,J),g.event.triggered=void 0,he&&(j[Fe]=he)),A.result}},simulate:function(A,B,j){var K=g.extend(new g.Event,j,{type:A,isSimulated:!0});g.event.trigger(K,null,B)}}),g.fn.extend({trigger:function(A,B){return this.each(function(){g.event.trigger(A,B,this)})},triggerHandler:function(A,B){var j=this[0];if(j)return g.event.trigger(A,B,j,!0)}}),d.focusin||g.each({focus:"focusin",blur:"focusout"},function(A,B){var j=c(function(K){g.event.simulate(B,K.target,g.event.fix(K))},"handler");g.event.special[B]={setup:function(){var K=this.ownerDocument||this.document||this,se=ke.access(K,B);se||K.addEventListener(A,j,!0),ke.access(K,B,(se||0)+1)},teardown:function(){var K=this.ownerDocument||this.document||this,se=ke.access(K,B)-1;se?ke.access(K,B,se):(K.removeEventListener(A,j,!0),ke.remove(K,B))}}});var X=h.location,Z={guid:Date.now()},we=/\?/;g.parseXML=function(A){var B,j;if(!A||typeof A!="string")return null;try{B=new h.DOMParser().parseFromString(A,"text/xml")}catch{}return j=B&&B.getElementsByTagName("parsererror")[0],(!B||j)&&g.error("Invalid XML: "+(j?g.map(j.childNodes,function(K){return K.textContent}).join(` +(()=>{var X1=Object.create;var fs=Object.defineProperty,J1=Object.defineProperties,Q1=Object.getOwnPropertyDescriptor,Z1=Object.getOwnPropertyDescriptors,e4=Object.getOwnPropertyNames,jl=Object.getOwnPropertySymbols,t4=Object.getPrototypeOf,Ul=Object.prototype.hasOwnProperty,n4=Object.prototype.propertyIsEnumerable;var Vl=(h,k,G)=>k in h?fs(h,k,{enumerable:!0,configurable:!0,writable:!0,value:G}):h[k]=G,Zo=(h,k)=>{for(var G in k||(k={}))Ul.call(k,G)&&Vl(h,G,k[G]);if(jl)for(var G of jl(k))n4.call(k,G)&&Vl(h,G,k[G]);return h},es=(h,k)=>J1(h,Z1(k)),zl=h=>fs(h,"__esModule",{value:!0}),c=(h,k)=>fs(h,"name",{value:k,configurable:!0}),ts=(h=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(h,{get:(k,G)=>(typeof require!="undefined"?require:k)[G]}):h)(function(h){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+h+'" is not supported')});var fr=(h,k)=>()=>(k||h((k={exports:{}}).exports,k),k.exports),Ba=(h,k)=>{zl(h);for(var G in k)fs(h,G,{get:k[G],enumerable:!0})},r4=(h,k,G)=>{if(k&&typeof k=="object"||typeof k=="function")for(let T of e4(k))!Ul.call(h,T)&&T!=="default"&&fs(h,T,{get:()=>k[T],enumerable:!(G=Q1(k,T))||G.enumerable});return h},zn=h=>r4(zl(fs(h!=null?X1(t4(h)):{},"default",h&&h.__esModule&&"default"in h?{get:()=>h.default,enumerable:!0}:{value:h,enumerable:!0})),h);var Ji=fr((Kl,Ks)=>{(function(h,k){"use strict";typeof Ks=="object"&&typeof Ks.exports=="object"?Ks.exports=h.document?k(h,!0):function(G){if(!G.document)throw new Error("jQuery requires a window with a document");return k(G)}:k(h)})(typeof window!="undefined"?window:Kl,function(h,k){"use strict";var G=[],T=Object.getPrototypeOf,m=G.slice,a=G.flat?function(A){return G.flat.call(A)}:function(A){return G.concat.apply([],A)},o=G.push,s=G.indexOf,r={},i=r.toString,n=r.hasOwnProperty,t=n.toString,e=t.call(Object),d={},f=c(function(B){return typeof B=="function"&&typeof B.nodeType!="number"&&typeof B.item!="function"},"isFunction"),p=c(function(B){return B!=null&&B===B.window},"isWindow"),l=h.document,v={type:!0,src:!0,nonce:!0,noModule:!0};function y(A,B,j){j=j||l;var K,se,ae=j.createElement("script");if(ae.text=A,B)for(K in v)se=B[K]||B.getAttribute&&B.getAttribute(K),se&&ae.setAttribute(K,se);j.head.appendChild(ae).parentNode.removeChild(ae)}c(y,"DOMEval");function b(A){return A==null?A+"":typeof A=="object"||typeof A=="function"?r[i.call(A)]||"object":typeof A}c(b,"toType");var w="3.6.4",g=c(function(A,B){return new g.fn.init(A,B)},"jQuery");g.fn=g.prototype={jquery:w,constructor:g,length:0,toArray:function(){return m.call(this)},get:function(A){return A==null?m.call(this):A<0?this[A+this.length]:this[A]},pushStack:function(A){var B=g.merge(this.constructor(),A);return B.prevObject=this,B},each:function(A){return g.each(this,A)},map:function(A){return this.pushStack(g.map(this,function(B,j){return A.call(B,j,B)}))},slice:function(){return this.pushStack(m.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(g.grep(this,function(A,B){return(B+1)%2}))},odd:function(){return this.pushStack(g.grep(this,function(A,B){return B%2}))},eq:function(A){var B=this.length,j=+A+(A<0?B:0);return this.pushStack(j>=0&&j0&&B-1 in A}c(_,"isArrayLike");var S=function(A){var B,j,K,se,ae,he,He,Fe,st,vt,Ht,gt,bt,vn,x,F,O,W,z,q="sizzle"+1*new Date,oe=A.document,ge=0,de=0,Ee=rs(),Le=rs(),it=rs(),yt=rs(),Ct=c(function(ve,Pe){return ve===Pe&&(Ht=!0),0},"sortOrder"),ot={}.hasOwnProperty,qt=[],zt=qt.pop,sn=qt.push,xn=qt.push,An=qt.slice,qn=c(function(ve,Pe){for(var Je=0,Ot=ve.length;Je+~]|"+kn+")"+kn+"*"),uo=new RegExp(kn+"|>"),ne=new RegExp(Kn),ue=new RegExp("^"+xr+"$"),Re={ID:new RegExp("^#("+xr+")"),CLASS:new RegExp("^\\.("+xr+")"),TAG:new RegExp("^("+xr+"|[*])"),ATTR:new RegExp("^"+rr),PSEUDO:new RegExp("^"+Kn),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+kn+"*(even|odd|(([+-]|)(\\d*)n|)"+kn+"*(?:([+-]|)"+kn+"*(\\d+)|))"+kn+"*\\)|)","i"),bool:new RegExp("^(?:"+Mr+")$","i"),needsContext:new RegExp("^"+kn+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+kn+"*((?:-\\d)?\\d*)"+kn+"*\\)|)(?=[^-]|$)","i")},Oe=/HTML$/i,rt=/^(?:input|select|textarea|button)$/i,Qe=/^h\d$/i,Rt=/^[^{]+\{\s*\[native \w/,Yt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Nn=/[+~]/,rn=new RegExp("\\\\[\\da-fA-F]{1,6}"+kn+"?|\\\\([^\\r\\n\\f])","g"),vr=c(function(ve,Pe){var Je="0x"+ve.slice(1)-65536;return Pe||(Je<0?String.fromCharCode(Je+65536):String.fromCharCode(Je>>10|55296,Je&1023|56320))},"funescape"),Er=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,$n=c(function(ve,Pe){return Pe?ve==="\0"?"\uFFFD":ve.slice(0,-1)+"\\"+ve.charCodeAt(ve.length-1).toString(16)+" ":"\\"+ve},"fcssescape"),co=c(function(){gt()},"unloadHandler"),yo=bo(function(ve){return ve.disabled===!0&&ve.nodeName.toLowerCase()==="fieldset"},{dir:"parentNode",next:"legend"});try{xn.apply(qt=An.call(oe.childNodes),oe.childNodes),qt[oe.childNodes.length].nodeType}catch{xn={apply:qt.length?function(Pe,Je){sn.apply(Pe,An.call(Je))}:function(Pe,Je){for(var Ot=Pe.length,at=0;Pe[Ot++]=Je[at++];);Pe.length=Ot-1}}}function Ar(ve,Pe,Je,Ot){var at,Wt,Vt,nn,cn,Fn,In,Bn=Pe&&Pe.ownerDocument,Hn=Pe?Pe.nodeType:9;if(Je=Je||[],typeof ve!="string"||!ve||Hn!==1&&Hn!==9&&Hn!==11)return Je;if(!Ot&&(gt(Pe),Pe=Pe||bt,x)){if(Hn!==11&&(cn=Yt.exec(ve)))if(at=cn[1]){if(Hn===9)if(Vt=Pe.getElementById(at)){if(Vt.id===at)return Je.push(Vt),Je}else return Je;else if(Bn&&(Vt=Bn.getElementById(at))&&z(Pe,Vt)&&Vt.id===at)return Je.push(Vt),Je}else{if(cn[2])return xn.apply(Je,Pe.getElementsByTagName(ve)),Je;if((at=cn[3])&&j.getElementsByClassName&&Pe.getElementsByClassName)return xn.apply(Je,Pe.getElementsByClassName(at)),Je}if(j.qsa&&!yt[ve+" "]&&(!F||!F.test(ve))&&(Hn!==1||Pe.nodeName.toLowerCase()!=="object")){if(In=ve,Bn=Pe,Hn===1&&(uo.test(ve)||Ei.test(ve))){for(Bn=Nn.test(ve)&&ys(Pe.parentNode)||Pe,(Bn!==Pe||!j.scope)&&((nn=Pe.getAttribute("id"))?nn=nn.replace(Er,$n):Pe.setAttribute("id",nn=q)),Fn=he(ve),Wt=Fn.length;Wt--;)Fn[Wt]=(nn?"#"+nn:":scope")+" "+Ko(Fn[Wt]);In=Fn.join(",")}try{return xn.apply(Je,Bn.querySelectorAll(In)),Je}catch{yt(ve,!0)}finally{nn===q&&Pe.removeAttribute("id")}}}return Fe(ve.replace(Sr,"$1"),Pe,Je,Ot)}c(Ar,"Sizzle");function rs(){var ve=[];function Pe(Je,Ot){return ve.push(Je+" ")>K.cacheLength&&delete Pe[ve.shift()],Pe[Je+" "]=Ot}return c(Pe,"cache"),Pe}c(rs,"createCache");function qr(ve){return ve[q]=!0,ve}c(qr,"markFunction");function to(ve){var Pe=bt.createElement("fieldset");try{return!!ve(Pe)}catch{return!1}finally{Pe.parentNode&&Pe.parentNode.removeChild(Pe),Pe=null}}c(to,"assert");function So(ve,Pe){for(var Je=ve.split("|"),Ot=Je.length;Ot--;)K.attrHandle[Je[Ot]]=Pe}c(So,"addHandle");function Gi(ve,Pe){var Je=Pe&&ve,Ot=Je&&ve.nodeType===1&&Pe.nodeType===1&&ve.sourceIndex-Pe.sourceIndex;if(Ot)return Ot;if(Je){for(;Je=Je.nextSibling;)if(Je===Pe)return-1}return ve?1:-1}c(Gi,"siblingCheck");function vs(ve){return function(Pe){var Je=Pe.nodeName.toLowerCase();return Je==="input"&&Pe.type===ve}}c(vs,"createInputPseudo");function is(ve){return function(Pe){var Je=Pe.nodeName.toLowerCase();return(Je==="input"||Je==="button")&&Pe.type===ve}}c(is,"createButtonPseudo");function Pi(ve){return function(Pe){return"form"in Pe?Pe.parentNode&&Pe.disabled===!1?"label"in Pe?"label"in Pe.parentNode?Pe.parentNode.disabled===ve:Pe.disabled===ve:Pe.isDisabled===ve||Pe.isDisabled!==!ve&&yo(Pe)===ve:Pe.disabled===ve:"label"in Pe?Pe.disabled===ve:!1}}c(Pi,"createDisabledPseudo");function Wn(ve){return qr(function(Pe){return Pe=+Pe,qr(function(Je,Ot){for(var at,Wt=ve([],Je.length,Pe),Vt=Wt.length;Vt--;)Je[at=Wt[Vt]]&&(Je[at]=!(Ot[at]=Je[at]))})})}c(Wn,"createPositionalPseudo");function ys(ve){return ve&&typeof ve.getElementsByTagName!="undefined"&&ve}c(ys,"testContext"),j=Ar.support={},ae=Ar.isXML=function(ve){var Pe=ve&&ve.namespaceURI,Je=ve&&(ve.ownerDocument||ve).documentElement;return!Oe.test(Pe||Je&&Je.nodeName||"HTML")},gt=Ar.setDocument=function(ve){var Pe,Je,Ot=ve?ve.ownerDocument||ve:oe;return Ot==bt||Ot.nodeType!==9||!Ot.documentElement||(bt=Ot,vn=bt.documentElement,x=!ae(bt),oe!=bt&&(Je=bt.defaultView)&&Je.top!==Je&&(Je.addEventListener?Je.addEventListener("unload",co,!1):Je.attachEvent&&Je.attachEvent("onunload",co)),j.scope=to(function(at){return vn.appendChild(at).appendChild(bt.createElement("div")),typeof at.querySelectorAll!="undefined"&&!at.querySelectorAll(":scope fieldset div").length}),j.cssHas=to(function(){try{return bt.querySelector(":has(*,:jqfake)"),!1}catch{return!0}}),j.attributes=to(function(at){return at.className="i",!at.getAttribute("className")}),j.getElementsByTagName=to(function(at){return at.appendChild(bt.createComment("")),!at.getElementsByTagName("*").length}),j.getElementsByClassName=Rt.test(bt.getElementsByClassName),j.getById=to(function(at){return vn.appendChild(at).id=q,!bt.getElementsByName||!bt.getElementsByName(q).length}),j.getById?(K.filter.ID=function(at){var Wt=at.replace(rn,vr);return function(Vt){return Vt.getAttribute("id")===Wt}},K.find.ID=function(at,Wt){if(typeof Wt.getElementById!="undefined"&&x){var Vt=Wt.getElementById(at);return Vt?[Vt]:[]}}):(K.filter.ID=function(at){var Wt=at.replace(rn,vr);return function(Vt){var nn=typeof Vt.getAttributeNode!="undefined"&&Vt.getAttributeNode("id");return nn&&nn.value===Wt}},K.find.ID=function(at,Wt){if(typeof Wt.getElementById!="undefined"&&x){var Vt,nn,cn,Fn=Wt.getElementById(at);if(Fn){if(Vt=Fn.getAttributeNode("id"),Vt&&Vt.value===at)return[Fn];for(cn=Wt.getElementsByName(at),nn=0;Fn=cn[nn++];)if(Vt=Fn.getAttributeNode("id"),Vt&&Vt.value===at)return[Fn]}return[]}}),K.find.TAG=j.getElementsByTagName?function(at,Wt){if(typeof Wt.getElementsByTagName!="undefined")return Wt.getElementsByTagName(at);if(j.qsa)return Wt.querySelectorAll(at)}:function(at,Wt){var Vt,nn=[],cn=0,Fn=Wt.getElementsByTagName(at);if(at==="*"){for(;Vt=Fn[cn++];)Vt.nodeType===1&&nn.push(Vt);return nn}return Fn},K.find.CLASS=j.getElementsByClassName&&function(at,Wt){if(typeof Wt.getElementsByClassName!="undefined"&&x)return Wt.getElementsByClassName(at)},O=[],F=[],(j.qsa=Rt.test(bt.querySelectorAll))&&(to(function(at){var Wt;vn.appendChild(at).innerHTML="",at.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+kn+`*(?:''|"")`),at.querySelectorAll("[selected]").length||F.push("\\["+kn+"*(?:value|"+Mr+")"),at.querySelectorAll("[id~="+q+"-]").length||F.push("~="),Wt=bt.createElement("input"),Wt.setAttribute("name",""),at.appendChild(Wt),at.querySelectorAll("[name='']").length||F.push("\\["+kn+"*name"+kn+"*="+kn+`*(?:''|"")`),at.querySelectorAll(":checked").length||F.push(":checked"),at.querySelectorAll("a#"+q+"+*").length||F.push(".#.+[+~]"),at.querySelectorAll("\\\f"),F.push("[\\r\\n\\f]")}),to(function(at){at.innerHTML="";var Wt=bt.createElement("input");Wt.setAttribute("type","hidden"),at.appendChild(Wt).setAttribute("name","D"),at.querySelectorAll("[name=d]").length&&F.push("name"+kn+"*[*^$|!~]?="),at.querySelectorAll(":enabled").length!==2&&F.push(":enabled",":disabled"),vn.appendChild(at).disabled=!0,at.querySelectorAll(":disabled").length!==2&&F.push(":enabled",":disabled"),at.querySelectorAll("*,:x"),F.push(",.*:")})),(j.matchesSelector=Rt.test(W=vn.matches||vn.webkitMatchesSelector||vn.mozMatchesSelector||vn.oMatchesSelector||vn.msMatchesSelector))&&to(function(at){j.disconnectedMatch=W.call(at,"*"),W.call(at,"[s!='']:x"),O.push("!=",Kn)}),j.cssHas||F.push(":has"),F=F.length&&new RegExp(F.join("|")),O=O.length&&new RegExp(O.join("|")),Pe=Rt.test(vn.compareDocumentPosition),z=Pe||Rt.test(vn.contains)?function(at,Wt){var Vt=at.nodeType===9&&at.documentElement||at,nn=Wt&&Wt.parentNode;return at===nn||!!(nn&&nn.nodeType===1&&(Vt.contains?Vt.contains(nn):at.compareDocumentPosition&&at.compareDocumentPosition(nn)&16))}:function(at,Wt){if(Wt){for(;Wt=Wt.parentNode;)if(Wt===at)return!0}return!1},Ct=Pe?function(at,Wt){if(at===Wt)return Ht=!0,0;var Vt=!at.compareDocumentPosition-!Wt.compareDocumentPosition;return Vt||(Vt=(at.ownerDocument||at)==(Wt.ownerDocument||Wt)?at.compareDocumentPosition(Wt):1,Vt&1||!j.sortDetached&&Wt.compareDocumentPosition(at)===Vt?at==bt||at.ownerDocument==oe&&z(oe,at)?-1:Wt==bt||Wt.ownerDocument==oe&&z(oe,Wt)?1:vt?qn(vt,at)-qn(vt,Wt):0:Vt&4?-1:1)}:function(at,Wt){if(at===Wt)return Ht=!0,0;var Vt,nn=0,cn=at.parentNode,Fn=Wt.parentNode,In=[at],Bn=[Wt];if(!cn||!Fn)return at==bt?-1:Wt==bt?1:cn?-1:Fn?1:vt?qn(vt,at)-qn(vt,Wt):0;if(cn===Fn)return Gi(at,Wt);for(Vt=at;Vt=Vt.parentNode;)In.unshift(Vt);for(Vt=Wt;Vt=Vt.parentNode;)Bn.unshift(Vt);for(;In[nn]===Bn[nn];)nn++;return nn?Gi(In[nn],Bn[nn]):In[nn]==oe?-1:Bn[nn]==oe?1:0}),bt},Ar.matches=function(ve,Pe){return Ar(ve,null,null,Pe)},Ar.matchesSelector=function(ve,Pe){if(gt(ve),j.matchesSelector&&x&&!yt[Pe+" "]&&(!O||!O.test(Pe))&&(!F||!F.test(Pe)))try{var Je=W.call(ve,Pe);if(Je||j.disconnectedMatch||ve.document&&ve.document.nodeType!==11)return Je}catch{yt(Pe,!0)}return Ar(Pe,bt,null,[ve]).length>0},Ar.contains=function(ve,Pe){return(ve.ownerDocument||ve)!=bt&>(ve),z(ve,Pe)},Ar.attr=function(ve,Pe){(ve.ownerDocument||ve)!=bt&>(ve);var Je=K.attrHandle[Pe.toLowerCase()],Ot=Je&&ot.call(K.attrHandle,Pe.toLowerCase())?Je(ve,Pe,!x):void 0;return Ot!==void 0?Ot:j.attributes||!x?ve.getAttribute(Pe):(Ot=ve.getAttributeNode(Pe))&&Ot.specified?Ot.value:null},Ar.escape=function(ve){return(ve+"").replace(Er,$n)},Ar.error=function(ve){throw new Error("Syntax error, unrecognized expression: "+ve)},Ar.uniqueSort=function(ve){var Pe,Je=[],Ot=0,at=0;if(Ht=!j.detectDuplicates,vt=!j.sortStable&&ve.slice(0),ve.sort(Ct),Ht){for(;Pe=ve[at++];)Pe===ve[at]&&(Ot=Je.push(at));for(;Ot--;)ve.splice(Je[Ot],1)}return vt=null,ve},se=Ar.getText=function(ve){var Pe,Je="",Ot=0,at=ve.nodeType;if(at){if(at===1||at===9||at===11){if(typeof ve.textContent=="string")return ve.textContent;for(ve=ve.firstChild;ve;ve=ve.nextSibling)Je+=se(ve)}else if(at===3||at===4)return ve.nodeValue}else for(;Pe=ve[Ot++];)Je+=se(Pe);return Je},K=Ar.selectors={cacheLength:50,createPseudo:qr,match:Re,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(ve){return ve[1]=ve[1].replace(rn,vr),ve[3]=(ve[3]||ve[4]||ve[5]||"").replace(rn,vr),ve[2]==="~="&&(ve[3]=" "+ve[3]+" "),ve.slice(0,4)},CHILD:function(ve){return ve[1]=ve[1].toLowerCase(),ve[1].slice(0,3)==="nth"?(ve[3]||Ar.error(ve[0]),ve[4]=+(ve[4]?ve[5]+(ve[6]||1):2*(ve[3]==="even"||ve[3]==="odd")),ve[5]=+(ve[7]+ve[8]||ve[3]==="odd")):ve[3]&&Ar.error(ve[0]),ve},PSEUDO:function(ve){var Pe,Je=!ve[6]&&ve[2];return Re.CHILD.test(ve[0])?null:(ve[3]?ve[2]=ve[4]||ve[5]||"":Je&&ne.test(Je)&&(Pe=he(Je,!0))&&(Pe=Je.indexOf(")",Je.length-Pe)-Je.length)&&(ve[0]=ve[0].slice(0,Pe),ve[2]=Je.slice(0,Pe)),ve.slice(0,3))}},filter:{TAG:function(ve){var Pe=ve.replace(rn,vr).toLowerCase();return ve==="*"?function(){return!0}:function(Je){return Je.nodeName&&Je.nodeName.toLowerCase()===Pe}},CLASS:function(ve){var Pe=Ee[ve+" "];return Pe||(Pe=new RegExp("(^|"+kn+")"+ve+"("+kn+"|$)"))&&Ee(ve,function(Je){return Pe.test(typeof Je.className=="string"&&Je.className||typeof Je.getAttribute!="undefined"&&Je.getAttribute("class")||"")})},ATTR:function(ve,Pe,Je){return function(Ot){var at=Ar.attr(Ot,ve);return at==null?Pe==="!=":Pe?(at+="",Pe==="="?at===Je:Pe==="!="?at!==Je:Pe==="^="?Je&&at.indexOf(Je)===0:Pe==="*="?Je&&at.indexOf(Je)>-1:Pe==="$="?Je&&at.slice(-Je.length)===Je:Pe==="~="?(" "+at.replace(ei," ")+" ").indexOf(Je)>-1:Pe==="|="?at===Je||at.slice(0,Je.length+1)===Je+"-":!1):!0}},CHILD:function(ve,Pe,Je,Ot,at){var Wt=ve.slice(0,3)!=="nth",Vt=ve.slice(-4)!=="last",nn=Pe==="of-type";return Ot===1&&at===0?function(cn){return!!cn.parentNode}:function(cn,Fn,In){var Bn,Hn,_r,Tn,ti,wi,qi=Wt!==Vt?"nextSibling":"previousSibling",zr=cn.parentNode,Fo=nn&&cn.nodeName.toLowerCase(),Go=!In&&!nn,no=!1;if(zr){if(Wt){for(;qi;){for(Tn=cn;Tn=Tn[qi];)if(nn?Tn.nodeName.toLowerCase()===Fo:Tn.nodeType===1)return!1;wi=qi=ve==="only"&&!wi&&"nextSibling"}return!0}if(wi=[Vt?zr.firstChild:zr.lastChild],Vt&&Go){for(Tn=zr,_r=Tn[q]||(Tn[q]={}),Hn=_r[Tn.uniqueID]||(_r[Tn.uniqueID]={}),Bn=Hn[ve]||[],ti=Bn[0]===ge&&Bn[1],no=ti&&Bn[2],Tn=ti&&zr.childNodes[ti];Tn=++ti&&Tn&&Tn[qi]||(no=ti=0)||wi.pop();)if(Tn.nodeType===1&&++no&&Tn===cn){Hn[ve]=[ge,ti,no];break}}else if(Go&&(Tn=cn,_r=Tn[q]||(Tn[q]={}),Hn=_r[Tn.uniqueID]||(_r[Tn.uniqueID]={}),Bn=Hn[ve]||[],ti=Bn[0]===ge&&Bn[1],no=ti),no===!1)for(;(Tn=++ti&&Tn&&Tn[qi]||(no=ti=0)||wi.pop())&&!((nn?Tn.nodeName.toLowerCase()===Fo:Tn.nodeType===1)&&++no&&(Go&&(_r=Tn[q]||(Tn[q]={}),Hn=_r[Tn.uniqueID]||(_r[Tn.uniqueID]={}),Hn[ve]=[ge,no]),Tn===cn)););return no-=at,no===Ot||no%Ot==0&&no/Ot>=0}}},PSEUDO:function(ve,Pe){var Je,Ot=K.pseudos[ve]||K.setFilters[ve.toLowerCase()]||Ar.error("unsupported pseudo: "+ve);return Ot[q]?Ot(Pe):Ot.length>1?(Je=[ve,ve,"",Pe],K.setFilters.hasOwnProperty(ve.toLowerCase())?qr(function(at,Wt){for(var Vt,nn=Ot(at,Pe),cn=nn.length;cn--;)Vt=qn(at,nn[cn]),at[Vt]=!(Wt[Vt]=nn[cn])}):function(at){return Ot(at,0,Je)}):Ot}},pseudos:{not:qr(function(ve){var Pe=[],Je=[],Ot=He(ve.replace(Sr,"$1"));return Ot[q]?qr(function(at,Wt,Vt,nn){for(var cn,Fn=Ot(at,null,nn,[]),In=at.length;In--;)(cn=Fn[In])&&(at[In]=!(Wt[In]=cn))}):function(at,Wt,Vt){return Pe[0]=at,Ot(Pe,null,Vt,Je),Pe[0]=null,!Je.pop()}}),has:qr(function(ve){return function(Pe){return Ar(ve,Pe).length>0}}),contains:qr(function(ve){return ve=ve.replace(rn,vr),function(Pe){return(Pe.textContent||se(Pe)).indexOf(ve)>-1}}),lang:qr(function(ve){return ue.test(ve||"")||Ar.error("unsupported lang: "+ve),ve=ve.replace(rn,vr).toLowerCase(),function(Pe){var Je;do if(Je=x?Pe.lang:Pe.getAttribute("xml:lang")||Pe.getAttribute("lang"))return Je=Je.toLowerCase(),Je===ve||Je.indexOf(ve+"-")===0;while((Pe=Pe.parentNode)&&Pe.nodeType===1);return!1}}),target:function(ve){var Pe=A.location&&A.location.hash;return Pe&&Pe.slice(1)===ve.id},root:function(ve){return ve===vn},focus:function(ve){return ve===bt.activeElement&&(!bt.hasFocus||bt.hasFocus())&&!!(ve.type||ve.href||~ve.tabIndex)},enabled:Pi(!1),disabled:Pi(!0),checked:function(ve){var Pe=ve.nodeName.toLowerCase();return Pe==="input"&&!!ve.checked||Pe==="option"&&!!ve.selected},selected:function(ve){return ve.parentNode&&ve.parentNode.selectedIndex,ve.selected===!0},empty:function(ve){for(ve=ve.firstChild;ve;ve=ve.nextSibling)if(ve.nodeType<6)return!1;return!0},parent:function(ve){return!K.pseudos.empty(ve)},header:function(ve){return Qe.test(ve.nodeName)},input:function(ve){return rt.test(ve.nodeName)},button:function(ve){var Pe=ve.nodeName.toLowerCase();return Pe==="input"&&ve.type==="button"||Pe==="button"},text:function(ve){var Pe;return ve.nodeName.toLowerCase()==="input"&&ve.type==="text"&&((Pe=ve.getAttribute("type"))==null||Pe.toLowerCase()==="text")},first:Wn(function(){return[0]}),last:Wn(function(ve,Pe){return[Pe-1]}),eq:Wn(function(ve,Pe,Je){return[Je<0?Je+Pe:Je]}),even:Wn(function(ve,Pe){for(var Je=0;JePe?Pe:Je;--Ot>=0;)ve.push(Ot);return ve}),gt:Wn(function(ve,Pe,Je){for(var Ot=Je<0?Je+Pe:Je;++Ot1?function(Pe,Je,Ot){for(var at=ve.length;at--;)if(!ve[at](Pe,Je,Ot))return!1;return!0}:ve[0]}c(jo,"elementMatcher");function xa(ve,Pe,Je){for(var Ot=0,at=Pe.length;Ot-1&&(Vt[In]=!(nn[In]=Hn))}}else zr=Eo(zr===nn?zr.splice(ti,zr.length):zr),at?at(null,nn,zr,Fn):xn.apply(nn,zr)})}c(bs,"setMatcher");function ws(ve){for(var Pe,Je,Ot,at=ve.length,Wt=K.relative[ve[0].type],Vt=Wt||K.relative[" "],nn=Wt?1:0,cn=bo(function(Bn){return Bn===Pe},Vt,!0),Fn=bo(function(Bn){return qn(Pe,Bn)>-1},Vt,!0),In=[function(Bn,Hn,_r){var Tn=!Wt&&(_r||Hn!==st)||((Pe=Hn).nodeType?cn(Bn,Hn,_r):Fn(Bn,Hn,_r));return Pe=null,Tn}];nn1&&jo(In),nn>1&&Ko(ve.slice(0,nn-1).concat({value:ve[nn-2].type===" "?"*":""})).replace(Sr,"$1"),Je,nn0,Ot=ve.length>0,at=c(function(Wt,Vt,nn,cn,Fn){var In,Bn,Hn,_r=0,Tn="0",ti=Wt&&[],wi=[],qi=st,zr=Wt||Ot&&K.find.TAG("*",Fn),Fo=ge+=qi==null?1:Math.random()||.1,Go=zr.length;for(Fn&&(st=Vt==bt||Vt||Fn);Tn!==Go&&(In=zr[Tn])!=null;Tn++){if(Ot&&In){for(Bn=0,!Vt&&In.ownerDocument!=bt&&(gt(In),nn=!x);Hn=ve[Bn++];)if(Hn(In,Vt||bt,nn)){cn.push(In);break}Fn&&(ge=Fo)}Je&&((In=!Hn&&In)&&_r--,Wt&&ti.push(In))}if(_r+=Tn,Je&&Tn!==_r){for(Bn=0;Hn=Pe[Bn++];)Hn(ti,wi,Vt,nn);if(Wt){if(_r>0)for(;Tn--;)ti[Tn]||wi[Tn]||(wi[Tn]=zt.call(cn));wi=Eo(wi)}xn.apply(cn,wi),Fn&&!Wt&&wi.length>0&&_r+Pe.length>1&&Ar.uniqueSort(cn)}return Fn&&(ge=Fo,st=qi),ti},"superMatcher");return Je?qr(at):at}return c(Ls,"matcherFromGroupMatchers"),He=Ar.compile=function(ve,Pe){var Je,Ot=[],at=[],Wt=it[ve+" "];if(!Wt){for(Pe||(Pe=he(ve)),Je=Pe.length;Je--;)Wt=ws(Pe[Je]),Wt[q]?Ot.push(Wt):at.push(Wt);Wt=it(ve,Ls(at,Ot)),Wt.selector=ve}return Wt},Fe=Ar.select=function(ve,Pe,Je,Ot){var at,Wt,Vt,nn,cn,Fn=typeof ve=="function"&&ve,In=!Ot&&he(ve=Fn.selector||ve);if(Je=Je||[],In.length===1){if(Wt=In[0]=In[0].slice(0),Wt.length>2&&(Vt=Wt[0]).type==="ID"&&Pe.nodeType===9&&x&&K.relative[Wt[1].type]){if(Pe=(K.find.ID(Vt.matches[0].replace(rn,vr),Pe)||[])[0],Pe)Fn&&(Pe=Pe.parentNode);else return Je;ve=ve.slice(Wt.shift().value.length)}for(at=Re.needsContext.test(ve)?0:Wt.length;at--&&(Vt=Wt[at],!K.relative[nn=Vt.type]);)if((cn=K.find[nn])&&(Ot=cn(Vt.matches[0].replace(rn,vr),Nn.test(Wt[0].type)&&ys(Pe.parentNode)||Pe))){if(Wt.splice(at,1),ve=Ot.length&&Ko(Wt),!ve)return xn.apply(Je,Ot),Je;break}}return(Fn||He(ve,In))(Ot,Pe,!x,Je,!Pe||Nn.test(ve)&&ys(Pe.parentNode)||Pe),Je},j.sortStable=q.split("").sort(Ct).join("")===q,j.detectDuplicates=!!Ht,gt(),j.sortDetached=to(function(ve){return ve.compareDocumentPosition(bt.createElement("fieldset"))&1}),to(function(ve){return ve.innerHTML="",ve.firstChild.getAttribute("href")==="#"})||So("type|href|height|width",function(ve,Pe,Je){if(!Je)return ve.getAttribute(Pe,Pe.toLowerCase()==="type"?1:2)}),(!j.attributes||!to(function(ve){return ve.innerHTML="",ve.firstChild.setAttribute("value",""),ve.firstChild.getAttribute("value")===""}))&&So("value",function(ve,Pe,Je){if(!Je&&ve.nodeName.toLowerCase()==="input")return ve.defaultValue}),to(function(ve){return ve.getAttribute("disabled")==null})||So(Mr,function(ve,Pe,Je){var Ot;if(!Je)return ve[Pe]===!0?Pe.toLowerCase():(Ot=ve.getAttributeNode(Pe))&&Ot.specified?Ot.value:null}),Ar}(h);g.find=S,g.expr=S.selectors,g.expr[":"]=g.expr.pseudos,g.uniqueSort=g.unique=S.uniqueSort,g.text=S.getText,g.isXMLDoc=S.isXML,g.contains=S.contains,g.escapeSelector=S.escape;var L=c(function(A,B,j){for(var K=[],se=j!==void 0;(A=A[B])&&A.nodeType!==9;)if(A.nodeType===1){if(se&&g(A).is(j))break;K.push(A)}return K},"dir"),C=c(function(A,B){for(var j=[];A;A=A.nextSibling)A.nodeType===1&&A!==B&&j.push(A);return j},"siblings"),M=g.expr.match.needsContext;function D(A,B){return A.nodeName&&A.nodeName.toLowerCase()===B.toLowerCase()}c(D,"nodeName");var P=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function U(A,B,j){return f(B)?g.grep(A,function(K,se){return!!B.call(K,se,K)!==j}):B.nodeType?g.grep(A,function(K){return K===B!==j}):typeof B!="string"?g.grep(A,function(K){return s.call(B,K)>-1!==j}):g.filter(B,A,j)}c(U,"winnow"),g.filter=function(A,B,j){var K=B[0];return j&&(A=":not("+A+")"),B.length===1&&K.nodeType===1?g.find.matchesSelector(K,A)?[K]:[]:g.find.matches(A,g.grep(B,function(se){return se.nodeType===1}))},g.fn.extend({find:function(A){var B,j,K=this.length,se=this;if(typeof A!="string")return this.pushStack(g(A).filter(function(){for(B=0;B1?g.uniqueSort(j):j},filter:function(A){return this.pushStack(U(this,A||[],!1))},not:function(A){return this.pushStack(U(this,A||[],!0))},is:function(A){return!!U(this,typeof A=="string"&&M.test(A)?g(A):A||[],!1).length}});var ee,le=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,fe=g.fn.init=function(A,B,j){var K,se;if(!A)return this;if(j=j||ee,typeof A=="string")if(A[0]==="<"&&A[A.length-1]===">"&&A.length>=3?K=[null,A,null]:K=le.exec(A),K&&(K[1]||!B))if(K[1]){if(B=B instanceof g?B[0]:B,g.merge(this,g.parseHTML(K[1],B&&B.nodeType?B.ownerDocument||B:l,!0)),P.test(K[1])&&g.isPlainObject(B))for(K in B)f(this[K])?this[K](B[K]):this.attr(K,B[K]);return this}else return se=l.getElementById(K[2]),se&&(this[0]=se,this.length=1),this;else return!B||B.jquery?(B||j).find(A):this.constructor(B).find(A);else{if(A.nodeType)return this[0]=A,this.length=1,this;if(f(A))return j.ready!==void 0?j.ready(A):A(g)}return g.makeArray(A,this)};fe.prototype=g.fn,ee=g(l);var be=/^(?:parents|prev(?:Until|All))/,ce={children:!0,contents:!0,next:!0,prev:!0};g.fn.extend({has:function(A){var B=g(A,this),j=B.length;return this.filter(function(){for(var K=0;K-1:j.nodeType===1&&g.find.matchesSelector(j,A))){ae.push(j);break}}return this.pushStack(ae.length>1?g.uniqueSort(ae):ae)},index:function(A){return A?typeof A=="string"?s.call(g(A),this[0]):s.call(this,A.jquery?A[0]:A):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(A,B){return this.pushStack(g.uniqueSort(g.merge(this.get(),g(A,B))))},addBack:function(A){return this.add(A==null?this.prevObject:this.prevObject.filter(A))}});function re(A,B){for(;(A=A[B])&&A.nodeType!==1;);return A}c(re,"sibling"),g.each({parent:function(A){var B=A.parentNode;return B&&B.nodeType!==11?B:null},parents:function(A){return L(A,"parentNode")},parentsUntil:function(A,B,j){return L(A,"parentNode",j)},next:function(A){return re(A,"nextSibling")},prev:function(A){return re(A,"previousSibling")},nextAll:function(A){return L(A,"nextSibling")},prevAll:function(A){return L(A,"previousSibling")},nextUntil:function(A,B,j){return L(A,"nextSibling",j)},prevUntil:function(A,B,j){return L(A,"previousSibling",j)},siblings:function(A){return C((A.parentNode||{}).firstChild,A)},children:function(A){return C(A.firstChild)},contents:function(A){return A.contentDocument!=null&&T(A.contentDocument)?A.contentDocument:(D(A,"template")&&(A=A.content||A),g.merge([],A.childNodes))}},function(A,B){g.fn[A]=function(j,K){var se=g.map(this,B,j);return A.slice(-5)!=="Until"&&(K=j),K&&typeof K=="string"&&(se=g.filter(K,se)),this.length>1&&(ce[A]||g.uniqueSort(se),be.test(A)&&se.reverse()),this.pushStack(se)}});var me=/[^\x20\t\r\n\f]+/g;function ye(A){var B={};return g.each(A.match(me)||[],function(j,K){B[K]=!0}),B}c(ye,"createOptions"),g.Callbacks=function(A){A=typeof A=="string"?ye(A):g.extend({},A);var B,j,K,se,ae=[],he=[],He=-1,Fe=c(function(){for(se=se||A.once,K=B=!0;he.length;He=-1)for(j=he.shift();++He-1;)ae.splice(gt,1),gt<=He&&He--}),this},has:function(vt){return vt?g.inArray(vt,ae)>-1:ae.length>0},empty:function(){return ae&&(ae=[]),this},disable:function(){return se=he=[],ae=j="",this},disabled:function(){return!ae},lock:function(){return se=he=[],!j&&!B&&(ae=j=""),this},locked:function(){return!!se},fireWith:function(vt,Ht){return se||(Ht=Ht||[],Ht=[vt,Ht.slice?Ht.slice():Ht],he.push(Ht),B||Fe()),this},fire:function(){return st.fireWith(this,arguments),this},fired:function(){return!!K}};return st};function We(A){return A}c(We,"Identity");function Ve(A){throw A}c(Ve,"Thrower");function _e(A,B,j,K){var se;try{A&&f(se=A.promise)?se.call(A).done(B).fail(j):A&&f(se=A.then)?se.call(A,B,j):B.apply(void 0,[A].slice(K))}catch(ae){j.apply(void 0,[ae])}}c(_e,"adoptValue"),g.extend({Deferred:function(A){var B=[["notify","progress",g.Callbacks("memory"),g.Callbacks("memory"),2],["resolve","done",g.Callbacks("once memory"),g.Callbacks("once memory"),0,"resolved"],["reject","fail",g.Callbacks("once memory"),g.Callbacks("once memory"),1,"rejected"]],j="pending",K={state:function(){return j},always:function(){return se.done(arguments).fail(arguments),this},catch:function(ae){return K.then(null,ae)},pipe:function(){var ae=arguments;return g.Deferred(function(he){g.each(B,function(He,Fe){var st=f(ae[Fe[4]])&&ae[Fe[4]];se[Fe[1]](function(){var vt=st&&st.apply(this,arguments);vt&&f(vt.promise)?vt.promise().progress(he.notify).done(he.resolve).fail(he.reject):he[Fe[0]+"With"](this,st?[vt]:arguments)})}),ae=null}).promise()},then:function(ae,he,He){var Fe=0;function st(vt,Ht,gt,bt){return function(){var vn=this,x=arguments,F=c(function(){var W,z;if(!(vt=Fe&&(gt!==Ve&&(vn=void 0,x=[W]),Ht.rejectWith(vn,x))}};vt?O():(g.Deferred.getStackHook&&(O.stackTrace=g.Deferred.getStackHook()),h.setTimeout(O))}}return c(st,"resolve"),g.Deferred(function(vt){B[0][3].add(st(0,vt,f(He)?He:We,vt.notifyWith)),B[1][3].add(st(0,vt,f(ae)?ae:We)),B[2][3].add(st(0,vt,f(he)?he:Ve))}).promise()},promise:function(ae){return ae!=null?g.extend(ae,K):K}},se={};return g.each(B,function(ae,he){var He=he[2],Fe=he[5];K[he[1]]=He.add,Fe&&He.add(function(){j=Fe},B[3-ae][2].disable,B[3-ae][3].disable,B[0][2].lock,B[0][3].lock),He.add(he[3].fire),se[he[0]]=function(){return se[he[0]+"With"](this===se?void 0:this,arguments),this},se[he[0]+"With"]=He.fireWith}),K.promise(se),A&&A.call(se,se),se},when:function(A){var B=arguments.length,j=B,K=Array(j),se=m.call(arguments),ae=g.Deferred(),he=c(function(He){return function(Fe){K[He]=this,se[He]=arguments.length>1?m.call(arguments):Fe,--B||ae.resolveWith(K,se)}},"updateFunc");if(B<=1&&(_e(A,ae.done(he(j)).resolve,ae.reject,!B),ae.state()==="pending"||f(se[j]&&se[j].then)))return ae.then();for(;j--;)_e(se[j],he(j),ae.reject);return ae.promise()}});var Ue=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;g.Deferred.exceptionHook=function(A,B){h.console&&h.console.warn&&A&&Ue.test(A.name)&&h.console.warn("jQuery.Deferred exception: "+A.message,A.stack,B)},g.readyException=function(A){h.setTimeout(function(){throw A})};var pe=g.Deferred();g.fn.ready=function(A){return pe.then(A).catch(function(B){g.readyException(B)}),this},g.extend({isReady:!1,readyWait:1,ready:function(A){(A===!0?--g.readyWait:g.isReady)||(g.isReady=!0,!(A!==!0&&--g.readyWait>0)&&pe.resolveWith(l,[g]))}}),g.ready.then=pe.then;function ct(){l.removeEventListener("DOMContentLoaded",ct),h.removeEventListener("load",ct),g.ready()}c(ct,"completed"),l.readyState==="complete"||l.readyState!=="loading"&&!l.documentElement.doScroll?h.setTimeout(g.ready):(l.addEventListener("DOMContentLoaded",ct),h.addEventListener("load",ct));var je=c(function(A,B,j,K,se,ae,he){var He=0,Fe=A.length,st=j==null;if(b(j)==="object"){se=!0;for(He in j)je(A,B,He,j[He],!0,ae,he)}else if(K!==void 0&&(se=!0,f(K)||(he=!0),st&&(he?(B.call(A,K),B=null):(st=B,B=c(function(vt,Ht,gt){return st.call(g(vt),gt)},"fn"))),B))for(;He1,null,!0)},removeData:function(A){return this.each(function(){$e.remove(this,A)})}}),g.extend({queue:function(A,B,j){var K;if(A)return B=(B||"fx")+"queue",K=ke.get(A,B),j&&(!K||Array.isArray(j)?K=ke.access(A,B,g.makeArray(j)):K.push(j)),K||[]},dequeue:function(A,B){B=B||"fx";var j=g.queue(A,B),K=j.length,se=j.shift(),ae=g._queueHooks(A,B),he=c(function(){g.dequeue(A,B)},"next");se==="inprogress"&&(se=j.shift(),K--),se&&(B==="fx"&&j.unshift("inprogress"),delete ae.stop,se.call(A,he,ae)),!K&&ae&&ae.empty.fire()},_queueHooks:function(A,B){var j=B+"queueHooks";return ke.get(A,j)||ke.access(A,j,{empty:g.Callbacks("once memory").add(function(){ke.remove(A,[B+"queue",j])})})}}),g.fn.extend({queue:function(A,B){var j=2;return typeof A!="string"&&(B=A,A="fx",j--),arguments.length\x20\t\r\n\f]*)/i,mn=/^$|^module$|\/(?:java|ecma)script/i;(function(){var A=l.createDocumentFragment(),B=A.appendChild(l.createElement("div")),j=l.createElement("input");j.setAttribute("type","radio"),j.setAttribute("checked","checked"),j.setAttribute("name","t"),B.appendChild(j),d.checkClone=B.cloneNode(!0).cloneNode(!0).lastChild.checked,B.innerHTML="",d.noCloneChecked=!!B.cloneNode(!0).lastChild.defaultValue,B.innerHTML="",d.option=!!B.lastChild})();var Un={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Un.tbody=Un.tfoot=Un.colgroup=Un.caption=Un.thead,Un.th=Un.td,d.option||(Un.optgroup=Un.option=[1,""]);function On(A,B){var j;return typeof A.getElementsByTagName!="undefined"?j=A.getElementsByTagName(B||"*"):typeof A.querySelectorAll!="undefined"?j=A.querySelectorAll(B||"*"):j=[],B===void 0||B&&D(A,B)?g.merge([A],j):j}c(On,"getAll");function dn(A,B){for(var j=0,K=A.length;j-1){se&&se.push(ae);continue}if(st=Et(ae),he=On(Ht.appendChild(ae),"script"),st&&dn(he),j)for(vt=0;ae=he[vt++];)mn.test(ae.type||"")&&j.push(ae)}return Ht}c(mr,"buildFragment");var ur=/^([^.]*)(?:\.(.+)|)/;function Qn(){return!0}c(Qn,"returnTrue");function $r(){return!1}c($r,"returnFalse");function hr(A,B){return A===Fr()==(B==="focus")}c(hr,"expectSync");function Fr(){try{return l.activeElement}catch{}}c(Fr,"safeActiveElement");function tr(A,B,j,K,se,ae){var he,He;if(typeof B=="object"){typeof j!="string"&&(K=K||j,j=void 0);for(He in B)tr(A,He,j,K,B[He],ae);return A}if(K==null&&se==null?(se=j,K=j=void 0):se==null&&(typeof j=="string"?(se=K,K=void 0):(se=K,K=j,j=void 0)),se===!1)se=$r;else if(!se)return A;return ae===1&&(he=se,se=c(function(Fe){return g().off(Fe),he.apply(this,arguments)},"fn"),se.guid=he.guid||(he.guid=g.guid++)),A.each(function(){g.event.add(this,B,se,K,j)})}c(tr,"on"),g.event={global:{},add:function(A,B,j,K,se){var ae,he,He,Fe,st,vt,Ht,gt,bt,vn,x,F=ke.get(A);if(!!Be(A))for(j.handler&&(ae=j,j=ae.handler,se=ae.selector),se&&g.find.matchesSelector(en,se),j.guid||(j.guid=g.guid++),(Fe=F.events)||(Fe=F.events=Object.create(null)),(he=F.handle)||(he=F.handle=function(O){return typeof g!="undefined"&&g.event.triggered!==O.type?g.event.dispatch.apply(A,arguments):void 0}),B=(B||"").match(me)||[""],st=B.length;st--;)He=ur.exec(B[st])||[],bt=x=He[1],vn=(He[2]||"").split(".").sort(),!!bt&&(Ht=g.event.special[bt]||{},bt=(se?Ht.delegateType:Ht.bindType)||bt,Ht=g.event.special[bt]||{},vt=g.extend({type:bt,origType:x,data:K,handler:j,guid:j.guid,selector:se,needsContext:se&&g.expr.match.needsContext.test(se),namespace:vn.join(".")},ae),(gt=Fe[bt])||(gt=Fe[bt]=[],gt.delegateCount=0,(!Ht.setup||Ht.setup.call(A,K,vn,he)===!1)&&A.addEventListener&&A.addEventListener(bt,he)),Ht.add&&(Ht.add.call(A,vt),vt.handler.guid||(vt.handler.guid=j.guid)),se?gt.splice(gt.delegateCount++,0,vt):gt.push(vt),g.event.global[bt]=!0)},remove:function(A,B,j,K,se){var ae,he,He,Fe,st,vt,Ht,gt,bt,vn,x,F=ke.hasData(A)&&ke.get(A);if(!(!F||!(Fe=F.events))){for(B=(B||"").match(me)||[""],st=B.length;st--;){if(He=ur.exec(B[st])||[],bt=x=He[1],vn=(He[2]||"").split(".").sort(),!bt){for(bt in Fe)g.event.remove(A,bt+B[st],j,K,!0);continue}for(Ht=g.event.special[bt]||{},bt=(K?Ht.delegateType:Ht.bindType)||bt,gt=Fe[bt]||[],He=He[2]&&new RegExp("(^|\\.)"+vn.join("\\.(?:.*\\.|)")+"(\\.|$)"),he=ae=gt.length;ae--;)vt=gt[ae],(se||x===vt.origType)&&(!j||j.guid===vt.guid)&&(!He||He.test(vt.namespace))&&(!K||K===vt.selector||K==="**"&&vt.selector)&&(gt.splice(ae,1),vt.selector&>.delegateCount--,Ht.remove&&Ht.remove.call(A,vt));he&&!gt.length&&((!Ht.teardown||Ht.teardown.call(A,vn,F.handle)===!1)&&g.removeEvent(A,bt,F.handle),delete Fe[bt])}g.isEmptyObject(Fe)&&ke.remove(A,"handle events")}},dispatch:function(A){var B,j,K,se,ae,he,He=new Array(arguments.length),Fe=g.event.fix(A),st=(ke.get(this,"events")||Object.create(null))[Fe.type]||[],vt=g.event.special[Fe.type]||{};for(He[0]=Fe,B=1;B=1)){for(;st!==this;st=st.parentNode||this)if(st.nodeType===1&&!(A.type==="click"&&st.disabled===!0)){for(ae=[],he={},j=0;j-1:g.find(se,this,null,[st]).length),he[se]&&ae.push(K);ae.length&&He.push({elem:st,handlers:ae})}}return st=this,Fe\s*$/g;function nr(A,B){return D(A,"table")&&D(B.nodeType!==11?B:B.firstChild,"tr")&&g(A).children("tbody")[0]||A}c(nr,"manipulationTarget");function Hr(A){return A.type=(A.getAttribute("type")!==null)+"/"+A.type,A}c(Hr,"disableScript");function Jn(A){return(A.type||"").slice(0,5)==="true/"?A.type=A.type.slice(5):A.removeAttribute("type"),A}c(Jn,"restoreScript");function br(A,B){var j,K,se,ae,he,He,Fe;if(B.nodeType===1){if(ke.hasData(A)&&(ae=ke.get(A),Fe=ae.events,Fe)){ke.remove(B,"handle events");for(se in Fe)for(j=0,K=Fe[se].length;j1&&typeof bt=="string"&&!d.checkClone&&po.test(bt))return A.each(function(x){var F=A.eq(x);vn&&(B[0]=bt.call(this,x,F.html())),Gr(F,B,j,K)});if(Ht&&(se=mr(B,A[0].ownerDocument,!1,A,K),ae=se.firstChild,se.childNodes.length===1&&(se=ae),ae||K)){for(he=g.map(On(se,"script"),Hr),He=he.length;vt0&&dn(he,!Fe&&On(A,"script")),He},cleanData:function(A){for(var B,j,K,se=g.event.special,ae=0;(j=A[ae])!==void 0;ae++)if(Be(j)){if(B=j[ke.expando]){if(B.events)for(K in B.events)se[K]?g.event.remove(j,K):g.removeEvent(j,K,B.handle);j[ke.expando]=void 0}j[$e.expando]&&(j[$e.expando]=void 0)}}}),g.fn.extend({detach:function(A){return kr(this,A,!0)},remove:function(A){return kr(this,A)},text:function(A){return je(this,function(B){return B===void 0?g.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=B)})},null,A,arguments.length)},append:function(){return Gr(this,arguments,function(A){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var B=nr(this,A);B.appendChild(A)}})},prepend:function(){return Gr(this,arguments,function(A){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var B=nr(this,A);B.insertBefore(A,B.firstChild)}})},before:function(){return Gr(this,arguments,function(A){this.parentNode&&this.parentNode.insertBefore(A,this)})},after:function(){return Gr(this,arguments,function(A){this.parentNode&&this.parentNode.insertBefore(A,this.nextSibling)})},empty:function(){for(var A,B=0;(A=this[B])!=null;B++)A.nodeType===1&&(g.cleanData(On(A,!1)),A.textContent="");return this},clone:function(A,B){return A=A??!1,B=B??A,this.map(function(){return g.clone(this,A,B)})},html:function(A){return je(this,function(B){var j=this[0]||{},K=0,se=this.length;if(B===void 0&&j.nodeType===1)return j.innerHTML;if(typeof B=="string"&&!ci.test(B)&&!Un[(Mn.exec(B)||["",""])[1].toLowerCase()]){B=g.htmlPrefilter(B);try{for(;K=0&&(Fe+=Math.max(0,Math.ceil(A["offset"+B[0].toUpperCase()+B.slice(1)]-ae-Fe-He-.5))||0),Fe}c(Ii,"boxModelAdjustment");function Oi(A,B,j){var K=oi(A),se=!d.boxSizingReliable()||j,ae=se&&g.css(A,"boxSizing",!1,K)==="border-box",he=ae,He=Ui(A,B,K),Fe="offset"+B[0].toUpperCase()+B.slice(1);if(xi.test(He)){if(!j)return He;He="auto"}return(!d.boxSizingReliable()&&ae||!d.reliableTrDimensions()&&D(A,"tr")||He==="auto"||!parseFloat(He)&&g.css(A,"display",!1,K)==="inline")&&A.getClientRects().length&&(ae=g.css(A,"boxSizing",!1,K)==="border-box",he=Fe in A,he&&(He=A[Fe])),He=parseFloat(He)||0,He+Ii(A,B,j||(ae?"border":"content"),he,K,He)+"px"}c(Oi,"getWidthOrHeight"),g.extend({cssHooks:{opacity:{get:function(A,B){if(B){var j=Ui(A,"opacity");return j===""?"1":j}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(A,B,j,K){if(!(!A||A.nodeType===3||A.nodeType===8||!A.style)){var se,ae,he,He=St(B),Fe=Ri.test(B),st=A.style;if(Fe||(B=si(He)),he=g.cssHooks[B]||g.cssHooks[He],j!==void 0){if(ae=typeof j,ae==="string"&&(se=Pt.exec(j))&&se[1]&&(j=_t(A,B,se),ae="number"),j==null||j!==j)return;ae==="number"&&!Fe&&(j+=se&&se[3]||(g.cssNumber[He]?"":"px")),!d.clearCloneStyle&&j===""&&B.indexOf("background")===0&&(st[B]="inherit"),(!he||!("set"in he)||(j=he.set(A,j,K))!==void 0)&&(Fe?st.setProperty(B,j):st[B]=j)}else return he&&"get"in he&&(se=he.get(A,!1,K))!==void 0?se:st[B]}},css:function(A,B,j,K){var se,ae,he,He=St(B),Fe=Ri.test(B);return Fe||(B=si(He)),he=g.cssHooks[B]||g.cssHooks[He],he&&"get"in he&&(se=he.get(A,!0,j)),se===void 0&&(se=Ui(A,B,K)),se==="normal"&&B in Ur&&(se=Ur[B]),j===""||j?(ae=parseFloat(se),j===!0||isFinite(ae)?ae||0:se):se}}),g.each(["height","width"],function(A,B){g.cssHooks[B]={get:function(j,K,se){if(K)return Ci.test(g.css(j,"display"))&&(!j.getClientRects().length||!j.getBoundingClientRect().width)?ji(j,jr,function(){return Oi(j,B,se)}):Oi(j,B,se)},set:function(j,K,se){var ae,he=oi(j),He=!d.scrollboxSize()&&he.position==="absolute",Fe=He||se,st=Fe&&g.css(j,"boxSizing",!1,he)==="border-box",vt=se?Ii(j,B,se,st,he):0;return st&&He&&(vt-=Math.ceil(j["offset"+B[0].toUpperCase()+B.slice(1)]-parseFloat(he[B])-Ii(j,B,"border",!1,he)-.5)),vt&&(ae=Pt.exec(K))&&(ae[3]||"px")!=="px"&&(j.style[B]=K,K=g.css(j,B)),Cr(j,K,vt)}}}),g.cssHooks.marginLeft=Fi(d.reliableMarginLeft,function(A,B){if(B)return(parseFloat(Ui(A,"marginLeft"))||A.getBoundingClientRect().left-ji(A,{marginLeft:0},function(){return A.getBoundingClientRect().left}))+"px"}),g.each({margin:"",padding:"",border:"Width"},function(A,B){g.cssHooks[A+B]={expand:function(j){for(var K=0,se={},ae=typeof j=="string"?j.split(" "):[j];K<4;K++)se[A+Bt[K]+B]=ae[K]||ae[K-2]||ae[0];return se}},A!=="margin"&&(g.cssHooks[A+B].set=Cr)}),g.fn.extend({css:function(A,B){return je(this,function(j,K,se){var ae,he,He={},Fe=0;if(Array.isArray(K)){for(ae=oi(j),he=K.length;Fe1)}});function ar(A,B,j,K,se){return new ar.prototype.init(A,B,j,K,se)}c(ar,"Tween"),g.Tween=ar,ar.prototype={constructor:ar,init:function(A,B,j,K,se,ae){this.elem=A,this.prop=j,this.easing=se||g.easing._default,this.options=B,this.start=this.now=this.cur(),this.end=K,this.unit=ae||(g.cssNumber[j]?"":"px")},cur:function(){var A=ar.propHooks[this.prop];return A&&A.get?A.get(this):ar.propHooks._default.get(this)},run:function(A){var B,j=ar.propHooks[this.prop];return this.options.duration?this.pos=B=g.easing[this.easing](A,this.options.duration*A,0,1,this.options.duration):this.pos=B=A,this.now=(this.end-this.start)*B+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),j&&j.set?j.set(this):ar.propHooks._default.set(this),this}},ar.prototype.init.prototype=ar.prototype,ar.propHooks={_default:{get:function(A){var B;return A.elem.nodeType!==1||A.elem[A.prop]!=null&&A.elem.style[A.prop]==null?A.elem[A.prop]:(B=g.css(A.elem,A.prop,""),!B||B==="auto"?0:B)},set:function(A){g.fx.step[A.prop]?g.fx.step[A.prop](A):A.elem.nodeType===1&&(g.cssHooks[A.prop]||A.elem.style[si(A.prop)]!=null)?g.style(A.elem,A.prop,A.now+A.unit):A.elem[A.prop]=A.now}}},ar.propHooks.scrollTop=ar.propHooks.scrollLeft={set:function(A){A.elem.nodeType&&A.elem.parentNode&&(A.elem[A.prop]=A.now)}},g.easing={linear:function(A){return A},swing:function(A){return .5-Math.cos(A*Math.PI)/2},_default:"swing"},g.fx=ar.prototype.init,g.fx.step={};var $i,Di,Vi=/^(?:toggle|show|hide)$/,ro=/queueHooks$/;function Si(){Di&&(l.hidden===!1&&h.requestAnimationFrame?h.requestAnimationFrame(Si):h.setTimeout(Si,g.fx.interval),g.fx.tick())}c(Si,"schedule");function Qr(){return h.setTimeout(function(){$i=void 0}),$i=Date.now()}c(Qr,"createFxNow");function Bi(A,B){var j,K=0,se={height:A};for(B=B?1:0;K<4;K+=2-B)j=Bt[K],se["margin"+j]=se["padding"+j]=A;return B&&(se.opacity=se.width=A),se}c(Bi,"genFx");function ri(A,B,j){for(var K,se=(Zr.tweeners[B]||[]).concat(Zr.tweeners["*"]),ae=0,he=se.length;ae1)},removeAttr:function(A){return this.each(function(){g.removeAttr(this,A)})}}),g.extend({attr:function(A,B,j){var K,se,ae=A.nodeType;if(!(ae===3||ae===8||ae===2)){if(typeof A.getAttribute=="undefined")return g.prop(A,B,j);if((ae!==1||!g.isXMLDoc(A))&&(se=g.attrHooks[B.toLowerCase()]||(g.expr.match.bool.test(B)?oo:void 0)),j!==void 0){if(j===null){g.removeAttr(A,B);return}return se&&"set"in se&&(K=se.set(A,j,B))!==void 0?K:(A.setAttribute(B,j+""),j)}return se&&"get"in se&&(K=se.get(A,B))!==null?K:(K=g.find.attr(A,B),K??void 0)}},attrHooks:{type:{set:function(A,B){if(!d.radioValue&&B==="radio"&&D(A,"input")){var j=A.value;return A.setAttribute("type",B),j&&(A.value=j),B}}}},removeAttr:function(A,B){var j,K=0,se=B&&B.match(me);if(se&&A.nodeType===1)for(;j=se[K++];)A.removeAttribute(j)}}),oo={set:function(A,B,j){return B===!1?g.removeAttr(A,j):A.setAttribute(j,j),j}},g.each(g.expr.match.bool.source.match(/\w+/g),function(A,B){var j=gr[B]||g.find.attr;gr[B]=function(K,se,ae){var he,He,Fe=se.toLowerCase();return ae||(He=gr[Fe],gr[Fe]=he,he=j(K,se,ae)!=null?Fe:null,gr[Fe]=He),he}});var Pn=/^(?:input|select|textarea|button)$/i,vo=/^(?:a|area)$/i;g.fn.extend({prop:function(A,B){return je(this,g.prop,A,B,arguments.length>1)},removeProp:function(A){return this.each(function(){delete this[g.propFix[A]||A]})}}),g.extend({prop:function(A,B,j){var K,se,ae=A.nodeType;if(!(ae===3||ae===8||ae===2))return(ae!==1||!g.isXMLDoc(A))&&(B=g.propFix[B]||B,se=g.propHooks[B]),j!==void 0?se&&"set"in se&&(K=se.set(A,j,B))!==void 0?K:A[B]=j:se&&"get"in se&&(K=se.get(A,B))!==null?K:A[B]},propHooks:{tabIndex:{get:function(A){var B=g.find.attr(A,"tabindex");return B?parseInt(B,10):Pn.test(A.nodeName)||vo.test(A.nodeName)&&A.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),d.optSelected||(g.propHooks.selected={get:function(A){var B=A.parentNode;return B&&B.parentNode&&B.parentNode.selectedIndex,null},set:function(A){var B=A.parentNode;B&&(B.selectedIndex,B.parentNode&&B.parentNode.selectedIndex)}}),g.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){g.propFix[this.toLowerCase()]=this});function Ir(A){var B=A.match(me)||[];return B.join(" ")}c(Ir,"stripAndCollapse");function yi(A){return A.getAttribute&&A.getAttribute("class")||""}c(yi,"getClass");function Zi(A){return Array.isArray(A)?A:typeof A=="string"?A.match(me)||[]:[]}c(Zi,"classesToArray"),g.fn.extend({addClass:function(A){var B,j,K,se,ae,he;return f(A)?this.each(function(He){g(this).addClass(A.call(this,He,yi(this)))}):(B=Zi(A),B.length?this.each(function(){if(K=yi(this),j=this.nodeType===1&&" "+Ir(K)+" ",j){for(ae=0;ae-1;)j=j.replace(" "+se+" "," ");he=Ir(j),K!==he&&this.setAttribute("class",he)}}):this):this.attr("class","")},toggleClass:function(A,B){var j,K,se,ae,he=typeof A,He=he==="string"||Array.isArray(A);return f(A)?this.each(function(Fe){g(this).toggleClass(A.call(this,Fe,yi(this),B),B)}):typeof B=="boolean"&&He?B?this.addClass(A):this.removeClass(A):(j=Zi(A),this.each(function(){if(He)for(ae=g(this),se=0;se-1)return!0;return!1}});var so=/\r/g;g.fn.extend({val:function(A){var B,j,K,se=this[0];return arguments.length?(K=f(A),this.each(function(ae){var he;this.nodeType===1&&(K?he=A.call(this,ae,g(this).val()):he=A,he==null?he="":typeof he=="number"?he+="":Array.isArray(he)&&(he=g.map(he,function(He){return He==null?"":He+""})),B=g.valHooks[this.type]||g.valHooks[this.nodeName.toLowerCase()],(!B||!("set"in B)||B.set(this,he,"value")===void 0)&&(this.value=he))})):se?(B=g.valHooks[se.type]||g.valHooks[se.nodeName.toLowerCase()],B&&"get"in B&&(j=B.get(se,"value"))!==void 0?j:(j=se.value,typeof j=="string"?j.replace(so,""):j??"")):void 0}}),g.extend({valHooks:{option:{get:function(A){var B=g.find.attr(A,"value");return B??Ir(g.text(A))}},select:{get:function(A){var B,j,K,se=A.options,ae=A.selectedIndex,he=A.type==="select-one",He=he?null:[],Fe=he?ae+1:se.length;for(ae<0?K=Fe:K=he?ae:0;K-1)&&(j=!0);return j||(A.selectedIndex=-1),ae}}}}),g.each(["radio","checkbox"],function(){g.valHooks[this]={set:function(A,B){if(Array.isArray(B))return A.checked=g.inArray(g(A).val(),B)>-1}},d.checkOn||(g.valHooks[this].get=function(A){return A.getAttribute("value")===null?"on":A.value})}),d.focusin="onfocusin"in h;var ai=/^(?:focusinfocus|focusoutblur)$/,J=c(function(A){A.stopPropagation()},"stopPropagationCallback");g.extend(g.event,{trigger:function(A,B,j,K){var se,ae,he,He,Fe,st,vt,Ht,gt=[j||l],bt=n.call(A,"type")?A.type:A,vn=n.call(A,"namespace")?A.namespace.split("."):[];if(ae=Ht=he=j=j||l,!(j.nodeType===3||j.nodeType===8)&&!ai.test(bt+g.event.triggered)&&(bt.indexOf(".")>-1&&(vn=bt.split("."),bt=vn.shift(),vn.sort()),Fe=bt.indexOf(":")<0&&"on"+bt,A=A[g.expando]?A:new g.Event(bt,typeof A=="object"&&A),A.isTrigger=K?2:3,A.namespace=vn.join("."),A.rnamespace=A.namespace?new RegExp("(^|\\.)"+vn.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,A.result=void 0,A.target||(A.target=j),B=B==null?[A]:g.makeArray(B,[A]),vt=g.event.special[bt]||{},!(!K&&vt.trigger&&vt.trigger.apply(j,B)===!1))){if(!K&&!vt.noBubble&&!p(j)){for(He=vt.delegateType||bt,ai.test(He+bt)||(ae=ae.parentNode);ae;ae=ae.parentNode)gt.push(ae),he=ae;he===(j.ownerDocument||l)&>.push(he.defaultView||he.parentWindow||h)}for(se=0;(ae=gt[se++])&&!A.isPropagationStopped();)Ht=ae,A.type=se>1?He:vt.bindType||bt,st=(ke.get(ae,"events")||Object.create(null))[A.type]&&ke.get(ae,"handle"),st&&st.apply(ae,B),st=Fe&&ae[Fe],st&&st.apply&&Be(ae)&&(A.result=st.apply(ae,B),A.result===!1&&A.preventDefault());return A.type=bt,!K&&!A.isDefaultPrevented()&&(!vt._default||vt._default.apply(gt.pop(),B)===!1)&&Be(j)&&Fe&&f(j[bt])&&!p(j)&&(he=j[Fe],he&&(j[Fe]=null),g.event.triggered=bt,A.isPropagationStopped()&&Ht.addEventListener(bt,J),j[bt](),A.isPropagationStopped()&&Ht.removeEventListener(bt,J),g.event.triggered=void 0,he&&(j[Fe]=he)),A.result}},simulate:function(A,B,j){var K=g.extend(new g.Event,j,{type:A,isSimulated:!0});g.event.trigger(K,null,B)}}),g.fn.extend({trigger:function(A,B){return this.each(function(){g.event.trigger(A,B,this)})},triggerHandler:function(A,B){var j=this[0];if(j)return g.event.trigger(A,B,j,!0)}}),d.focusin||g.each({focus:"focusin",blur:"focusout"},function(A,B){var j=c(function(K){g.event.simulate(B,K.target,g.event.fix(K))},"handler");g.event.special[B]={setup:function(){var K=this.ownerDocument||this.document||this,se=ke.access(K,B);se||K.addEventListener(A,j,!0),ke.access(K,B,(se||0)+1)},teardown:function(){var K=this.ownerDocument||this.document||this,se=ke.access(K,B)-1;se?ke.access(K,B,se):(K.removeEventListener(A,j,!0),ke.remove(K,B))}}});var X=h.location,Z={guid:Date.now()},we=/\?/;g.parseXML=function(A){var B,j;if(!A||typeof A!="string")return null;try{B=new h.DOMParser().parseFromString(A,"text/xml")}catch{}return j=B&&B.getElementsByTagName("parsererror")[0],(!B||j)&&g.error("Invalid XML: "+(j?g.map(j.childNodes,function(K){return K.textContent}).join(` `):A)),B};var ze=/\[\]$/,Ge=/\r?\n/g,nt=/^(?:submit|button|image|reset|file)$/i,mt=/^(?:input|select|textarea|keygen)/i;function Gt(A,B,j,K){var se;if(Array.isArray(B))g.each(B,function(ae,he){j||ze.test(A)?K(A,he):Gt(A+"["+(typeof he=="object"&&he!=null?ae:"")+"]",he,j,K)});else if(!j&&b(B)==="object")for(se in B)Gt(A+"["+se+"]",B[se],j,K);else K(A,B)}c(Gt,"buildParams"),g.param=function(A,B){var j,K=[],se=c(function(ae,he){var He=f(he)?he():he;K[K.length]=encodeURIComponent(ae)+"="+encodeURIComponent(He??"")},"add");if(A==null)return"";if(Array.isArray(A)||A.jquery&&!g.isPlainObject(A))g.each(A,function(){se(this.name,this.value)});else for(j in A)Gt(j,A[j],B,se);return K.join("&")},g.fn.extend({serialize:function(){return g.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var A=g.prop(this,"elements");return A?g.makeArray(A):this}).filter(function(){var A=this.type;return this.name&&!g(this).is(":disabled")&&mt.test(this.nodeName)&&!nt.test(A)&&(this.checked||!Gn.test(A))}).map(function(A,B){var j=g(this).val();return j==null?null:Array.isArray(j)?g.map(j,function(K){return{name:B.name,value:K.replace(Ge,`\r `)}}):{name:B.name,value:j.replace(Ge,`\r -`)}}).get()}});var Jt=/%20/g,Dn=/#.*$/,gn=/([?&])_=[^&]*/,_n=/^(.*?):[ \t]*([^\r\n]*)$/mg,or=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Rn=/^(?:GET|HEAD)$/,Qt=/^\/\//,Vn={},Vr={},hi="*/".concat("*"),Ki=l.createElement("a");Ki.href=X.href;function ao(A){return function(B,j){typeof B!="string"&&(j=B,B="*");var K,se=0,ae=B.toLowerCase().match(me)||[];if(f(j))for(;K=ae[se++];)K[0]==="+"?(K=K.slice(1)||"*",(A[K]=A[K]||[]).unshift(j)):(A[K]=A[K]||[]).push(j)}}c(ao,"addToPrefiltersOrTransports");function eo(A,B,j,K){var se={},ae=A===Vr;function he(He){var Fe;return se[He]=!0,g.each(A[He]||[],function(st,vt){var Ht=vt(B,j,K);if(typeof Ht=="string"&&!ae&&!se[Ht])return B.dataTypes.unshift(Ht),he(Ht),!1;if(ae)return!(Fe=Ht)}),Fe}return c(he,"inspect"),he(B.dataTypes[0])||!se["*"]&&he("*")}c(eo,"inspectPrefiltersOrTransports");function lo(A,B){var j,K,se=g.ajaxSettings.flatOptions||{};for(j in B)B[j]!==void 0&&((se[j]?A:K||(K={}))[j]=B[j]);return K&&g.extend(!0,A,K),A}c(lo,"ajaxExtend");function ko(A,B,j){for(var K,se,ae,he,He=A.contents,Fe=A.dataTypes;Fe[0]==="*";)Fe.shift(),K===void 0&&(K=A.mimeType||B.getResponseHeader("Content-Type"));if(K){for(se in He)if(He[se]&&He[se].test(K)){Fe.unshift(se);break}}if(Fe[0]in j)ae=Fe[0];else{for(se in j){if(!Fe[0]||A.converters[se+" "+Fe[0]]){ae=se;break}he||(he=se)}ae=ae||he}if(ae)return ae!==Fe[0]&&Fe.unshift(ae),j[ae]}c(ko,"ajaxHandleResponses");function li(A,B,j,K){var se,ae,he,He,Fe,st={},vt=A.dataTypes.slice();if(vt[1])for(he in A.converters)st[he.toLowerCase()]=A.converters[he];for(ae=vt.shift();ae;)if(A.responseFields[ae]&&(j[A.responseFields[ae]]=B),!Fe&&K&&A.dataFilter&&(B=A.dataFilter(B,A.dataType)),Fe=ae,ae=vt.shift(),ae){if(ae==="*")ae=Fe;else if(Fe!=="*"&&Fe!==ae){if(he=st[Fe+" "+ae]||st["* "+ae],!he){for(se in st)if(He=se.split(" "),He[1]===ae&&(he=st[Fe+" "+He[0]]||st["* "+He[0]],he)){he===!0?he=st[se]:st[se]!==!0&&(ae=He[0],vt.unshift(He[1]));break}}if(he!==!0)if(he&&A.throws)B=he(B);else try{B=he(B)}catch(Ht){return{state:"parsererror",error:he?Ht:"No conversion from "+Fe+" to "+ae}}}}return{state:"success",data:B}}c(li,"ajaxConvert"),g.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:X.href,type:"GET",isLocal:or.test(X.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":hi,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":g.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(A,B){return B?lo(lo(A,g.ajaxSettings),B):lo(g.ajaxSettings,A)},ajaxPrefilter:ao(Vn),ajaxTransport:ao(Vr),ajax:function(A,B){typeof A=="object"&&(B=A,A=void 0),B=B||{};var j,K,se,ae,he,He,Fe,st,vt,Ht,gt=g.ajaxSetup({},B),bt=gt.context||gt,vn=gt.context&&(bt.nodeType||bt.jquery)?g(bt):g.event,w=g.Deferred(),F=g.Callbacks("once memory"),O=gt.statusCode||{},W={},z={},q="canceled",oe={readyState:0,getResponseHeader:function(de){var Ee;if(Fe){if(!ae)for(ae={};Ee=_n.exec(se);)ae[Ee[1].toLowerCase()+" "]=(ae[Ee[1].toLowerCase()+" "]||[]).concat(Ee[2]);Ee=ae[de.toLowerCase()+" "]}return Ee==null?null:Ee.join(", ")},getAllResponseHeaders:function(){return Fe?se:null},setRequestHeader:function(de,Ee){return Fe==null&&(de=z[de.toLowerCase()]=z[de.toLowerCase()]||de,W[de]=Ee),this},overrideMimeType:function(de){return Fe==null&&(gt.mimeType=de),this},statusCode:function(de){var Ee;if(de)if(Fe)oe.always(de[oe.status]);else for(Ee in de)O[Ee]=[O[Ee],de[Ee]];return this},abort:function(de){var Ee=de||q;return j&&j.abort(Ee),ge(0,Ee),this}};if(w.promise(oe),gt.url=((A||gt.url||X.href)+"").replace(Qt,X.protocol+"//"),gt.type=B.method||B.type||gt.method||gt.type,gt.dataTypes=(gt.dataType||"*").toLowerCase().match(me)||[""],gt.crossDomain==null){He=l.createElement("a");try{He.href=gt.url,He.href=He.href,gt.crossDomain=Ki.protocol+"//"+Ki.host!=He.protocol+"//"+He.host}catch{gt.crossDomain=!0}}if(gt.data&>.processData&&typeof gt.data!="string"&&(gt.data=g.param(gt.data,gt.traditional)),eo(Vn,gt,B,oe),Fe)return oe;st=g.event&>.global,st&&g.active++==0&&g.event.trigger("ajaxStart"),gt.type=gt.type.toUpperCase(),gt.hasContent=!Rn.test(gt.type),K=gt.url.replace(Dn,""),gt.hasContent?gt.data&>.processData&&(gt.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(gt.data=gt.data.replace(Jt,"+")):(Ht=gt.url.slice(K.length),gt.data&&(gt.processData||typeof gt.data=="string")&&(K+=(we.test(K)?"&":"?")+gt.data,delete gt.data),gt.cache===!1&&(K=K.replace(gn,"$1"),Ht=(we.test(K)?"&":"?")+"_="+Z.guid+++Ht),gt.url=K+Ht),gt.ifModified&&(g.lastModified[K]&&oe.setRequestHeader("If-Modified-Since",g.lastModified[K]),g.etag[K]&&oe.setRequestHeader("If-None-Match",g.etag[K])),(gt.data&>.hasContent&>.contentType!==!1||B.contentType)&&oe.setRequestHeader("Content-Type",gt.contentType),oe.setRequestHeader("Accept",gt.dataTypes[0]&>.accepts[gt.dataTypes[0]]?gt.accepts[gt.dataTypes[0]]+(gt.dataTypes[0]!=="*"?", "+hi+"; q=0.01":""):gt.accepts["*"]);for(vt in gt.headers)oe.setRequestHeader(vt,gt.headers[vt]);if(gt.beforeSend&&(gt.beforeSend.call(bt,oe,gt)===!1||Fe))return oe.abort();if(q="abort",F.add(gt.complete),oe.done(gt.success),oe.fail(gt.error),j=eo(Vr,gt,B,oe),!j)ge(-1,"No Transport");else{if(oe.readyState=1,st&&vn.trigger("ajaxSend",[oe,gt]),Fe)return oe;gt.async&>.timeout>0&&(he=h.setTimeout(function(){oe.abort("timeout")},gt.timeout));try{Fe=!1,j.send(W,ge)}catch(de){if(Fe)throw de;ge(-1,de)}}function ge(de,Ee,Le,it){var yt,Ct,ot,qt,zt,sn=Ee;Fe||(Fe=!0,he&&h.clearTimeout(he),j=void 0,se=it||"",oe.readyState=de>0?4:0,yt=de>=200&&de<300||de===304,Le&&(qt=ko(gt,oe,Le)),!yt&&g.inArray("script",gt.dataTypes)>-1&&g.inArray("json",gt.dataTypes)<0&&(gt.converters["text script"]=function(){}),qt=li(gt,qt,oe,yt),yt?(gt.ifModified&&(zt=oe.getResponseHeader("Last-Modified"),zt&&(g.lastModified[K]=zt),zt=oe.getResponseHeader("etag"),zt&&(g.etag[K]=zt)),de===204||gt.type==="HEAD"?sn="nocontent":de===304?sn="notmodified":(sn=qt.state,Ct=qt.data,ot=qt.error,yt=!ot)):(ot=sn,(de||!sn)&&(sn="error",de<0&&(de=0))),oe.status=de,oe.statusText=(Ee||sn)+"",yt?w.resolveWith(bt,[Ct,sn,oe]):w.rejectWith(bt,[oe,sn,ot]),oe.statusCode(O),O=void 0,st&&vn.trigger(yt?"ajaxSuccess":"ajaxError",[oe,gt,yt?Ct:ot]),F.fireWith(bt,[oe,sn]),st&&(vn.trigger("ajaxComplete",[oe,gt]),--g.active||g.event.trigger("ajaxStop")))}return c(ge,"done"),oe},getJSON:function(A,B,j){return g.get(A,B,j,"json")},getScript:function(A,B){return g.get(A,void 0,B,"script")}}),g.each(["get","post"],function(A,B){g[B]=function(j,K,se,ae){return f(K)&&(ae=ae||se,se=K,K=void 0),g.ajax(g.extend({url:j,type:B,dataType:ae,data:K,success:se},g.isPlainObject(j)&&j))}}),g.ajaxPrefilter(function(A){var B;for(B in A.headers)B.toLowerCase()==="content-type"&&(A.contentType=A.headers[B]||"")}),g._evalUrl=function(A,B,j){return g.ajax({url:A,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(K){g.globalEval(K,B,j)}})},g.fn.extend({wrapAll:function(A){var B;return this[0]&&(f(A)&&(A=A.call(this[0])),B=g(A,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&B.insertBefore(this[0]),B.map(function(){for(var j=this;j.firstElementChild;)j=j.firstElementChild;return j}).append(this)),this},wrapInner:function(A){return f(A)?this.each(function(B){g(this).wrapInner(A.call(this,B))}):this.each(function(){var B=g(this),j=B.contents();j.length?j.wrapAll(A):B.append(A)})},wrap:function(A){var B=f(A);return this.each(function(j){g(this).wrapAll(B?A.call(this,j):A)})},unwrap:function(A){return this.parent(A).not("body").each(function(){g(this).replaceWith(this.childNodes)}),this}}),g.expr.pseudos.hidden=function(A){return!g.expr.pseudos.visible(A)},g.expr.pseudos.visible=function(A){return!!(A.offsetWidth||A.offsetHeight||A.getClientRects().length)},g.ajaxSettings.xhr=function(){try{return new h.XMLHttpRequest}catch{}};var Co={0:200,1223:204},bi=g.ajaxSettings.xhr();d.cors=!!bi&&"withCredentials"in bi,d.ajax=bi=!!bi,g.ajaxTransport(function(A){var B,j;if(d.cors||bi&&!A.crossDomain)return{send:function(K,se){var ae,he=A.xhr();if(he.open(A.type,A.url,A.async,A.username,A.password),A.xhrFields)for(ae in A.xhrFields)he[ae]=A.xhrFields[ae];A.mimeType&&he.overrideMimeType&&he.overrideMimeType(A.mimeType),!A.crossDomain&&!K["X-Requested-With"]&&(K["X-Requested-With"]="XMLHttpRequest");for(ae in K)he.setRequestHeader(ae,K[ae]);B=c(function(He){return function(){B&&(B=j=he.onload=he.onerror=he.onabort=he.ontimeout=he.onreadystatechange=null,He==="abort"?he.abort():He==="error"?typeof he.status!="number"?se(0,"error"):se(he.status,he.statusText):se(Co[he.status]||he.status,he.statusText,(he.responseType||"text")!=="text"||typeof he.responseText!="string"?{binary:he.response}:{text:he.responseText},he.getAllResponseHeaders()))}},"callback"),he.onload=B(),j=he.onerror=he.ontimeout=B("error"),he.onabort!==void 0?he.onabort=j:he.onreadystatechange=function(){he.readyState===4&&h.setTimeout(function(){B&&j()})},B=B("abort");try{he.send(A.hasContent&&A.data||null)}catch(He){if(B)throw He}},abort:function(){B&&B()}}}),g.ajaxPrefilter(function(A){A.crossDomain&&(A.contents.script=!1)}),g.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(A){return g.globalEval(A),A}}}),g.ajaxPrefilter("script",function(A){A.cache===void 0&&(A.cache=!1),A.crossDomain&&(A.type="GET")}),g.ajaxTransport("script",function(A){if(A.crossDomain||A.scriptAttrs){var B,j;return{send:function(K,se){B=g("