-keep class android.accessibilityservice.AccessibilityServiceInfo {
    <init>();
    <init>(android.content.pm.ResolveInfo, android.content.Context);

    public static java.lang.String capabilityToString(int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static java.lang.String feedbackTypeToString(int);
    public static java.lang.String flagToString(int);
    public boolean getCanRetrieveWindowContent();
    public int getCapabilities();
    public java.util.List getCapabilityInfos();
    public java.util.List getCapabilityInfos(android.content.Context);
    public android.content.ComponentName getComponentName();
    public java.lang.String getDescription();
    public java.lang.String getId();
    public android.content.pm.ResolveInfo getResolveInfo();
    public java.lang.String getSettingsActivityName();
    public int hashCode();
    public boolean isDirectBootAware();
    public java.lang.String loadDescription(android.content.pm.PackageManager);
    public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
    public void setCapabilities(int);
    public void setComponentName(android.content.ComponentName);
    public java.lang.String toString();
    public void updateDynamicallyConfigurableProperties(android.accessibilityservice.AccessibilityServiceInfo);
    public void writeToParcel(android.os.Parcel, int);


    public static int CAPABILITY_CAN_CONTROL_MAGNIFICATION;
    public static int CAPABILITY_CAN_PERFORM_GESTURES;
    public static int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
    public static int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
    public static int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES;
    public static int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
    public static int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DEFAULT;
    public static int FEEDBACK_ALL_MASK;
    public static int FEEDBACK_AUDIBLE;
    public static int FEEDBACK_BRAILLE;
    public static int FEEDBACK_GENERIC;
    public static int FEEDBACK_HAPTIC;
    public static int FEEDBACK_SPOKEN;
    public static int FEEDBACK_VISUAL;
    public static int FLAG_ENABLE_ACCESSIBILITY_VOLUME;
    public static int FLAG_FORCE_DIRECT_BOOT_AWARE;
    public static int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    public static int FLAG_REPORT_VIEW_IDS;
    public static int FLAG_REQUEST_ACCESSIBILITY_BUTTON;
    public static int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
    public static int FLAG_REQUEST_FILTER_KEY_EVENTS;
    public static int FLAG_REQUEST_FINGERPRINT_GESTURES;
    public static int FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
    public static int FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
    public boolean crashed;
    public int eventTypes;
    public int feedbackType;
    public int flags;
    public long notificationTimeout;
    public java.lang.String[] packageNames;
}

-keep class android.accessibilityservice.AccessibilityServiceInfo$CapabilityInfo {
    <init>(int, int, int);



    public int capability;
    public int descResId;
    public int titleResId;
}

-keep class android.accessibilityservice.IAccessibilityServiceClient {

    public abstract void clearAccessibilityCache();
    public abstract void init(android.accessibilityservice.IAccessibilityServiceConnection, int, android.os.IBinder);
    public abstract void onAccessibilityButtonAvailabilityChanged(boolean);
    public abstract void onAccessibilityButtonClicked();
    public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent, boolean);
    public abstract void onFingerprintCapturingGesturesChanged(boolean);
    public abstract void onFingerprintGesture(int);
    public abstract void onGesture(int);
    public abstract void onInterrupt();
    public abstract void onKeyEvent(android.view.KeyEvent, int);
    public abstract void onMagnificationChanged(android.graphics.Region, float, float, float);
    public abstract void onPerformGestureResult(int, boolean);
    public abstract void onSoftKeyboardShowModeChanged(int);


}

-keep class android.accessibilityservice.IAccessibilityServiceConnection {

    public abstract void disableSelf();
    public abstract java.lang.String[] findAccessibilityNodeInfoByAccessibilityId(int, long, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, long, android.os.Bundle);
    public abstract java.lang.String[] findAccessibilityNodeInfosByText(int, long, java.lang.String, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract java.lang.String[] findAccessibilityNodeInfosByViewId(int, long, java.lang.String, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract java.lang.String[] findFocus(int, long, int, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract java.lang.String[] focusSearch(int, long, int, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract float getMagnificationCenterX();
    public abstract float getMagnificationCenterY();
    public abstract android.graphics.Region getMagnificationRegion();
    public abstract float getMagnificationScale();
    public abstract android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
    public abstract android.view.accessibility.AccessibilityWindowInfo getWindow(int);
    public abstract java.util.List getWindows();
    public abstract boolean isAccessibilityButtonAvailable();
    public abstract boolean isFingerprintGestureDetectionAvailable();
    public abstract boolean performAccessibilityAction(int, long, int, android.os.Bundle, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
    public abstract boolean performGlobalAction(int);
    public abstract boolean resetMagnification(boolean);
    public abstract void sendGesture(int, android.content.pm.ParceledListSlice);
    public abstract void setMagnificationCallbackEnabled(boolean);
    public abstract boolean setMagnificationScaleAndCenter(float, float, float, boolean);
    public abstract void setOnKeyEventResult(boolean, int);
    public abstract void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
    public abstract void setSoftKeyboardCallbackEnabled(boolean);
    public abstract boolean setSoftKeyboardShowMode(int);


}

-keep class android.accounts.Account {
    <init>(java.lang.String, java.lang.String);
    <init>(android.accounts.Account, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getAccessId();
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String name;
    public java.lang.String type;
}

-keep class android.animation.AnimationHandler {
    <init>();

    public void addAnimationFrameCallback(android.animation.AnimationHandler$AnimationFrameCallback, long);
    public void addOneShotCommitCallback(android.animation.AnimationHandler$AnimationFrameCallback);
    public static int getAnimationCount();
    public static long getFrameDelay();
    public static android.animation.AnimationHandler getInstance();
    public void removeCallback(android.animation.AnimationHandler$AnimationFrameCallback);
    public static void setFrameDelay(long);
    public void setProvider(android.animation.AnimationHandler$AnimationFrameCallbackProvider);


    public static java.lang.ThreadLocal sAnimatorHandler;
}

-keep class android.animation.AnimationHandler$AnimationFrameCallback {

    public abstract void commitAnimationFrame(long);
    public abstract boolean doAnimationFrame(long);


}

-keep class android.animation.AnimationHandler$AnimationFrameCallbackProvider {

    public abstract long getFrameDelay();
    public abstract long getFrameTime();
    public abstract void postCommitCallback(java.lang.Runnable);
    public abstract void postFrameCallback(android.view.Choreographer$FrameCallback);
    public abstract void setFrameDelay(long);


}

-keep class android.animation.Animator {
    <init>();

    public void addListener(android.animation.Animator$AnimatorListener);
    public void addPauseListener(android.animation.Animator$AnimatorPauseListener);
    public void appendChangingConfigurations(int);
    public boolean canReverse();
    public void cancel();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public android.content.res.ConstantState createConstantState();
    public void end();
    public int getChangingConfigurations();
    public abstract long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public java.util.ArrayList getListeners();
    public abstract long getStartDelay();
    public long getTotalDuration();
    public boolean isPaused();
    public abstract boolean isRunning();
    public boolean isStarted();
    public void pause();
    public void removeAllListeners();
    public void removeListener(android.animation.Animator$AnimatorListener);
    public void removePauseListener(android.animation.Animator$AnimatorPauseListener);
    public void resume();
    public void reverse();
    public void setAllowRunningAsynchronously(boolean);
    public void setChangingConfigurations(int);
    public abstract android.animation.Animator setDuration(long);
    public abstract void setInterpolator(android.animation.TimeInterpolator);
    public abstract void setStartDelay(long);
    public void setTarget(java.lang.Object);
    public void setupEndValues();
    public void setupStartValues();
    public void start();


    public static long DURATION_INFINITE;
}

-keep class android.animation.Animator$AnimatorListener {

    public abstract void onAnimationCancel(android.animation.Animator);
    public void onAnimationEnd(android.animation.Animator, boolean);
    public abstract void onAnimationEnd(android.animation.Animator);
    public abstract void onAnimationRepeat(android.animation.Animator);
    public void onAnimationStart(android.animation.Animator, boolean);
    public abstract void onAnimationStart(android.animation.Animator);


}

-keep class android.animation.Animator$AnimatorPauseListener {

    public abstract void onAnimationPause(android.animation.Animator);
    public abstract void onAnimationResume(android.animation.Animator);


}

-keep class android.animation.AnimatorSet {
    <init>();

    public boolean canReverse();
    public void cancel();
    public android.animation.AnimatorSet clone();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public void commitAnimationFrame(long);
    public boolean doAnimationFrame(long);
    public void end();
    public int getChangingConfigurations();
    public java.util.ArrayList getChildAnimations();
    public long getCurrentPlayTime();
    public long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public long getStartDelay();
    public long getTotalDuration();
    public boolean isRunning();
    public boolean isStarted();
    public void pause();
    public android.animation.AnimatorSet$Builder play(android.animation.Animator);
    public void playSequentially(android.animation.Animator[]);
    public void playSequentially(java.util.List);
    public void playTogether(android.animation.Animator[]);
    public void playTogether(java.util.Collection);
    public void resume();
    public void reverse();
    public void setCurrentPlayTime(long);
    public android.animation.AnimatorSet setDuration(long);
    public android.animation.Animator setDuration(long);
    public void setInterpolator(android.animation.TimeInterpolator);
    public void setStartDelay(long);
    public void setTarget(java.lang.Object);
    public void setupEndValues();
    public void setupStartValues();
    public boolean shouldPlayTogether();
    public void start();
    public java.lang.String toString();


}

-keep class android.animation.AnimatorSet$Builder {

    public android.animation.AnimatorSet$Builder after(android.animation.Animator);
    public android.animation.AnimatorSet$Builder after(long);
    public android.animation.AnimatorSet$Builder before(android.animation.Animator);
    public android.animation.AnimatorSet$Builder with(android.animation.Animator);


}

-keep class android.animation.Keyframe {
    <init>();

    public abstract android.animation.Keyframe clone();
    public java.lang.Object clone();
    public float getFraction();
    public android.animation.TimeInterpolator getInterpolator();
    public java.lang.Class getType();
    public abstract java.lang.Object getValue();
    public boolean hasValue();
    public static android.animation.Keyframe ofFloat(float, float);
    public static android.animation.Keyframe ofFloat(float);
    public static android.animation.Keyframe ofInt(float, int);
    public static android.animation.Keyframe ofInt(float);
    public static android.animation.Keyframe ofObject(float, java.lang.Object);
    public static android.animation.Keyframe ofObject(float);
    public void setFraction(float);
    public void setInterpolator(android.animation.TimeInterpolator);
    public abstract void setValue(java.lang.Object);


}

-keep class android.animation.LayoutTransition {
    <init>();

    public void addChild(android.view.ViewGroup, android.view.View);
    public void addTransitionListener(android.animation.LayoutTransition$TransitionListener);
    public void cancel();
    public void cancel(int);
    public void disableTransitionType(int);
    public void enableTransitionType(int);
    public void endChangingAnimations();
    public android.animation.Animator getAnimator(int);
    public long getDuration(int);
    public android.animation.TimeInterpolator getInterpolator(int);
    public long getStagger(int);
    public long getStartDelay(int);
    public java.util.List getTransitionListeners();
    public void hideChild(android.view.ViewGroup, android.view.View);
    public void hideChild(android.view.ViewGroup, android.view.View, int);
    public boolean isChangingLayout();
    public boolean isRunning();
    public boolean isTransitionTypeEnabled(int);
    public void layoutChange(android.view.ViewGroup);
    public void removeChild(android.view.ViewGroup, android.view.View);
    public void removeTransitionListener(android.animation.LayoutTransition$TransitionListener);
    public void setAnimateParentHierarchy(boolean);
    public void setAnimator(int, android.animation.Animator);
    public void setDuration(long);
    public void setDuration(int, long);
    public void setInterpolator(int, android.animation.TimeInterpolator);
    public void setStagger(int, long);
    public void setStartDelay(int, long);
    public void showChild(android.view.ViewGroup, android.view.View);
    public void showChild(android.view.ViewGroup, android.view.View, int);
    public void startChangingAnimations();


    public static int APPEARING;
    public static int CHANGE_APPEARING;
    public static int CHANGE_DISAPPEARING;
    public static int CHANGING;
    public static int DISAPPEARING;
}

-keep class android.animation.LayoutTransition$TransitionListener {

    public abstract void endTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
    public abstract void startTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);


}

-keep class android.animation.PropertyValuesHolder {

    public android.animation.PropertyValuesHolder clone();
    public java.lang.Object clone();
    public java.lang.String getPropertyName();
    public void getPropertyValues(android.animation.PropertyValuesHolder$PropertyValues);
    public java.lang.Class getValueType();
    public static android.animation.PropertyValuesHolder ofFloat(java.lang.String, float[]);
    public static android.animation.PropertyValuesHolder ofFloat(android.util.Property, float[]);
    public static android.animation.PropertyValuesHolder ofInt(java.lang.String, int[]);
    public static android.animation.PropertyValuesHolder ofInt(android.util.Property, int[]);
    public static android.animation.PropertyValuesHolder ofKeyframe(java.lang.String, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe[]);
    public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter, android.graphics.Path);
    public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path);
    public void setConverter(android.animation.TypeConverter);
    public void setEvaluator(android.animation.TypeEvaluator);
    public void setFloatValues(float[]);
    public void setIntValues(int[]);
    public void setKeyframes(android.animation.Keyframe[]);
    public void setObjectValues(java.lang.Object[]);
    public void setProperty(android.util.Property);
    public void setPropertyName(java.lang.String);
    public java.lang.String toString();


    protected android.util.Property mProperty;
}

-keep class android.animation.PropertyValuesHolder$PropertyValues {
    <init>();

    public java.lang.String toString();


    public android.animation.PropertyValuesHolder$PropertyValues$DataSource dataSource;
    public java.lang.Object endValue;
    public java.lang.String propertyName;
    public java.lang.Object startValue;
    public java.lang.Class type;
}

-keep class android.animation.PropertyValuesHolder$PropertyValues$DataSource {

    public abstract java.lang.Object getValueAtFraction(float);


}

-keep class android.animation.StateListAnimator {
    <init>();

    public void addState(int[], android.animation.Animator);
    public void appendChangingConfigurations(int);
    public android.animation.StateListAnimator clone();
    public java.lang.Object clone();
    public android.content.res.ConstantState createConstantState();
    public int getChangingConfigurations();
    public android.animation.Animator getRunningAnimator();
    public android.view.View getTarget();
    public java.util.ArrayList getTuples();
    public void jumpToCurrentState();
    public void setChangingConfigurations(int);
    public void setState(int[]);
    public void setTarget(android.view.View);


}

-keep class android.animation.StateListAnimator$Tuple {

    public android.animation.Animator getAnimator();
    public int[] getSpecs();


}

-keep class android.animation.TimeInterpolator {

    public abstract float getInterpolation(float);


}

-keep class android.animation.TypeConverter {
    <init>(java.lang.Class, java.lang.Class);

    public abstract java.lang.Object convert(java.lang.Object);


}

-keep class android.animation.TypeEvaluator {

    public abstract java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);


}

-keep class android.animation.ValueAnimator {
    <init>();

    public void addUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
    public static boolean areAnimatorsEnabled();
    public boolean canReverse();
    public void cancel();
    public android.animation.ValueAnimator clone();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public void commitAnimationFrame(long);
    public boolean doAnimationFrame(long);
    public void end();
    public float getAnimatedFraction();
    public java.lang.Object getAnimatedValue();
    public java.lang.Object getAnimatedValue(java.lang.String);
    public android.animation.AnimationHandler getAnimationHandler();
    public static int getCurrentAnimationsCount();
    public long getCurrentPlayTime();
    public long getDuration();
    public static float getDurationScale();
    public static long getFrameDelay();
    public android.animation.TimeInterpolator getInterpolator();
    public int getRepeatCount();
    public int getRepeatMode();
    public long getStartDelay();
    public long getTotalDuration();
    public android.animation.PropertyValuesHolder[] getValues();
    public boolean isRunning();
    public boolean isStarted();
    public static android.animation.ValueAnimator ofArgb(int[]);
    public static android.animation.ValueAnimator ofFloat(float[]);
    public static android.animation.ValueAnimator ofInt(int[]);
    public static android.animation.ValueAnimator ofObject(android.animation.TypeEvaluator, java.lang.Object[]);
    public static android.animation.ValueAnimator ofPropertyValuesHolder(android.animation.PropertyValuesHolder[]);
    public void overrideDurationScale(float);
    public void pause();
    public void removeAllUpdateListeners();
    public void removeUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
    public void resume();
    public void reverse();
    public void setAllowRunningAsynchronously(boolean);
    public void setCurrentFraction(float);
    public void setCurrentPlayTime(long);
    public android.animation.ValueAnimator setDuration(long);
    public android.animation.Animator setDuration(long);
    public static void setDurationScale(float);
    public void setEvaluator(android.animation.TypeEvaluator);
    public void setFloatValues(float[]);
    public static void setFrameDelay(long);
    public void setIntValues(int[]);
    public void setInterpolator(android.animation.TimeInterpolator);
    public void setObjectValues(java.lang.Object[]);
    public void setRepeatCount(int);
    public void setRepeatMode(int);
    public void setStartDelay(long);
    public void setValues(android.animation.PropertyValuesHolder[]);
    public void start();
    public java.lang.String toString();


    public static int INFINITE;
    public static int RESTART;
    public static int REVERSE;
}

-keep class android.animation.ValueAnimator$AnimatorUpdateListener {

    public abstract void onAnimationUpdate(android.animation.ValueAnimator);


}

-keep class android.app.ActionBar {
    <init>();

    public abstract void addOnMenuVisibilityListener(android.app.ActionBar$OnMenuVisibilityListener);
    public abstract void addTab(android.app.ActionBar$Tab);
    public abstract void addTab(android.app.ActionBar$Tab, boolean);
    public abstract void addTab(android.app.ActionBar$Tab, int);
    public abstract void addTab(android.app.ActionBar$Tab, int, boolean);
    public boolean closeOptionsMenu();
    public boolean collapseActionView();
    public void dispatchMenuVisibilityChanged(boolean);
    public abstract android.view.View getCustomView();
    public abstract int getDisplayOptions();
    public float getElevation();
    public abstract int getHeight();
    public int getHideOffset();
    public abstract int getNavigationItemCount();
    public abstract int getNavigationMode();
    public abstract int getSelectedNavigationIndex();
    public abstract android.app.ActionBar$Tab getSelectedTab();
    public abstract java.lang.CharSequence getSubtitle();
    public abstract android.app.ActionBar$Tab getTabAt(int);
    public abstract int getTabCount();
    public android.content.Context getThemedContext();
    public abstract java.lang.CharSequence getTitle();
    public abstract void hide();
    public boolean invalidateOptionsMenu();
    public boolean isHideOnContentScrollEnabled();
    public abstract boolean isShowing();
    public boolean isTitleTruncated();
    public abstract android.app.ActionBar$Tab newTab();
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onDestroy();
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onMenuKeyEvent(android.view.KeyEvent);
    public boolean openOptionsMenu();
    public abstract void removeAllTabs();
    public abstract void removeOnMenuVisibilityListener(android.app.ActionBar$OnMenuVisibilityListener);
    public abstract void removeTab(android.app.ActionBar$Tab);
    public abstract void removeTabAt(int);
    public abstract void selectTab(android.app.ActionBar$Tab);
    public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public abstract void setCustomView(android.view.View);
    public abstract void setCustomView(android.view.View, android.app.ActionBar$LayoutParams);
    public abstract void setCustomView(int);
    public void setDefaultDisplayHomeAsUpEnabled(boolean);
    public abstract void setDisplayHomeAsUpEnabled(boolean);
    public abstract void setDisplayOptions(int);
    public abstract void setDisplayOptions(int, int);
    public abstract void setDisplayShowCustomEnabled(boolean);
    public abstract void setDisplayShowHomeEnabled(boolean);
    public abstract void setDisplayShowTitleEnabled(boolean);
    public abstract void setDisplayUseLogoEnabled(boolean);
    public void setElevation(float);
    public void setHideOffset(int);
    public void setHideOnContentScrollEnabled(boolean);
    public void setHomeActionContentDescription(java.lang.CharSequence);
    public void setHomeActionContentDescription(int);
    public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
    public void setHomeAsUpIndicator(int);
    public void setHomeButtonEnabled(boolean);
    public abstract void setIcon(int);
    public abstract void setIcon(android.graphics.drawable.Drawable);
    public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.app.ActionBar$OnNavigationListener);
    public abstract void setLogo(int);
    public abstract void setLogo(android.graphics.drawable.Drawable);
    public abstract void setNavigationMode(int);
    public abstract void setSelectedNavigationItem(int);
    public void setShowHideAnimationEnabled(boolean);
    public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
    public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
    public abstract void setSubtitle(java.lang.CharSequence);
    public abstract void setSubtitle(int);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setTitle(int);
    public void setWindowTitle(java.lang.CharSequence);
    public abstract void show();
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);


    public static int DISPLAY_HOME_AS_UP;
    public static int DISPLAY_SHOW_CUSTOM;
    public static int DISPLAY_SHOW_HOME;
    public static int DISPLAY_SHOW_TITLE;
    public static int DISPLAY_TITLE_MULTIPLE_LINES;
    public static int DISPLAY_USE_LOGO;
    public static int NAVIGATION_MODE_LIST;
    public static int NAVIGATION_MODE_STANDARD;
    public static int NAVIGATION_MODE_TABS;
}

-keep class android.app.ActionBar$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, int);
    <init>(int);
    <init>(android.app.ActionBar$LayoutParams);
    <init>(android.view.ViewGroup$LayoutParams);

    protected void encodeProperties(android.view.ViewHierarchyEncoder);


    public int gravity;
}

-keep class android.app.ActionBar$OnMenuVisibilityListener {

    public abstract void onMenuVisibilityChanged(boolean);


}

-keep class android.app.ActionBar$OnNavigationListener {

    public abstract boolean onNavigationItemSelected(int, long);


}

-keep class android.app.ActionBar$Tab {
    <init>();

    public abstract java.lang.CharSequence getContentDescription();
    public abstract android.view.View getCustomView();
    public abstract android.graphics.drawable.Drawable getIcon();
    public abstract int getPosition();
    public abstract java.lang.Object getTag();
    public abstract java.lang.CharSequence getText();
    public abstract void select();
    public abstract android.app.ActionBar$Tab setContentDescription(int);
    public abstract android.app.ActionBar$Tab setContentDescription(java.lang.CharSequence);
    public abstract android.app.ActionBar$Tab setCustomView(android.view.View);
    public abstract android.app.ActionBar$Tab setCustomView(int);
    public abstract android.app.ActionBar$Tab setIcon(android.graphics.drawable.Drawable);
    public abstract android.app.ActionBar$Tab setIcon(int);
    public abstract android.app.ActionBar$Tab setTabListener(android.app.ActionBar$TabListener);
    public abstract android.app.ActionBar$Tab setTag(java.lang.Object);
    public abstract android.app.ActionBar$Tab setText(java.lang.CharSequence);
    public abstract android.app.ActionBar$Tab setText(int);


    public static int INVALID_POSITION;
}

-keep class android.app.ActionBar$TabListener {

    public abstract void onTabReselected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
    public abstract void onTabSelected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
    public abstract void onTabUnselected(android.app.ActionBar$Tab, android.app.FragmentTransaction);


}

-keep class android.app.Activity {
    <init>();

    public void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    protected void attachBaseContext(android.content.Context);
    public void autofillClientAuthenticate(int, android.content.IntentSender, android.content.Intent);
    public void autofillClientDispatchUnhandledKey(android.view.View, android.view.KeyEvent);
    public android.view.View autofillClientFindViewByAccessibilityIdTraversal(int, int);
    public android.view.View autofillClientFindViewByAutofillIdTraversal(android.view.autofill.AutofillId);
    public android.view.View[] autofillClientFindViewsByAutofillIdTraversal(android.view.autofill.AutofillId[]);
    public android.os.IBinder autofillClientGetActivityToken();
    public android.content.ComponentName autofillClientGetComponentName();
    public android.view.autofill.AutofillId autofillClientGetNextAutofillId();
    public boolean[] autofillClientGetViewVisibility(android.view.autofill.AutofillId[]);
    public boolean autofillClientIsCompatibilityModeEnabled();
    public boolean autofillClientIsFillUiShowing();
    public boolean autofillClientIsVisibleForAutofill();
    public boolean autofillClientRequestHideFillUi();
    public boolean autofillClientRequestShowFillUi(android.view.View, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
    public void autofillClientResetableStateAvailable();
    public void autofillClientRunOnUiThread(java.lang.Runnable);
    public boolean canStartActivityForResult();
    public void closeContextMenu();
    public void closeOptionsMenu();
    public void convertFromTranslucent();
    public boolean convertToTranslucent(android.app.Activity$TranslucentConversionListener, android.app.ActivityOptions);
    public android.app.PendingIntent createPendingResult(int, android.content.Intent, int);
    public void dismissDialog(int);
    public void dismissKeyboardShortcutsHelper();
    public void dispatchEnterAnimationComplete();
    public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void enterPictureInPictureMode();
    public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
    public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
    public void enterPictureInPictureModeIfPossible();
    public void exitFreeformMode();
    public android.view.View findViewById(int);
    public void finish();
    public void finishActivity(int);
    public void finishActivityFromChild(android.app.Activity, int);
    public void finishAffinity();
    public void finishAfterTransition();
    public void finishAndRemoveTask();
    public void finishFromChild(android.app.Activity);
    public android.app.ActionBar getActionBar();
    public android.app.ActivityThread getActivityThread();
    public android.os.IBinder getActivityToken();
    public android.app.Application getApplication();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public android.content.ComponentName getCallingActivity();
    public java.lang.String getCallingPackage();
    public int getChangingConfigurations();
    public android.content.ComponentName getComponentName();
    public android.transition.Scene getContentScene();
    public android.transition.TransitionManager getContentTransitionManager();
    public android.view.View getCurrentFocus();
    public android.app.FragmentManager getFragmentManager();
    public android.content.Intent getIntent();
    public java.lang.Object getLastNonConfigurationInstance();
    public android.view.LayoutInflater getLayoutInflater();
    public android.app.LoaderManager getLoaderManager();
    public java.lang.String getLocalClassName();
    public int getMaxNumPictureInPictureActions();
    public android.media.session.MediaController getMediaController();
    public android.view.MenuInflater getMenuInflater();
    public int getNextAutofillId();
    public android.app.Activity getParent();
    public android.content.Intent getParentActivityIntent();
    public android.content.SharedPreferences getPreferences(int);
    public android.net.Uri getReferrer();
    public int getRequestedOrientation();
    public android.view.SearchEvent getSearchEvent();
    public java.lang.Object getSystemService(java.lang.String);
    public int getTaskId();
    public java.lang.CharSequence getTitle();
    public int getTitleColor();
    public android.app.VoiceInteractor getVoiceInteractor();
    public int getVolumeControlStream();
    public android.view.Window getWindow();
    public android.view.WindowManager getWindowManager();
    public boolean hasWindowFocus();
    public void invalidateOptionsMenu();
    public boolean isActivityTransitionRunning();
    public boolean isBackgroundVisibleBehind();
    public boolean isChangingConfigurations();
    public boolean isChild();
    public boolean isDestroyed();
    public boolean isDisablingEnterExitEventForAutofill();
    public boolean isFinishing();
    public boolean isImmersive();
    public boolean isInMultiWindowMode();
    public boolean isInPictureInPictureMode();
    public boolean isLocalVoiceInteractionSupported();
    public boolean isOverlayWithDecorCaptionEnabled();
    public boolean isResumed();
    public boolean isTaskRoot();
    public boolean isVoiceInteraction();
    public boolean isVoiceInteractionRoot();
    public android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String);
    public android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public boolean moveTaskToBack(boolean);
    public boolean navigateUpTo(android.content.Intent);
    public boolean navigateUpToFromChild(android.app.Activity, android.content.Intent);
    public void onActionModeFinished(android.view.ActionMode);
    public void onActionModeStarted(android.view.ActionMode);
    public void onActivityReenter(int, android.content.Intent);
    protected void onActivityResult(int, int, android.content.Intent);
    protected void onApplyThemeResource(android.content.res.Resources$Theme, int, boolean);
    public void onAttachFragment(android.app.Fragment);
    public void onAttachedToWindow();
    public void onBackPressed();
    public void onBackgroundVisibleBehindChanged(boolean);
    protected void onChildTitleChanged(android.app.Activity, java.lang.CharSequence);
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onContentChanged();
    public boolean onContextItemSelected(android.view.MenuItem);
    public void onContextMenuClosed(android.view.Menu);
    protected void onCreate(android.os.Bundle);
    public void onCreate(android.os.Bundle, android.os.PersistableBundle);
    public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
    public java.lang.CharSequence onCreateDescription();
    protected android.app.Dialog onCreateDialog(int);
    protected android.app.Dialog onCreateDialog(int, android.os.Bundle);
    public void onCreateNavigateUpTaskStack(android.app.TaskStackBuilder);
    public boolean onCreateOptionsMenu(android.view.Menu);
    public boolean onCreatePanelMenu(int, android.view.Menu);
    public android.view.View onCreatePanelView(int);
    public boolean onCreateThumbnail(android.graphics.Bitmap, android.graphics.Canvas);
    public android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);
    public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
    protected void onDestroy();
    public void onDetachedFromWindow();
    public void onEnterAnimationComplete();
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public boolean onKeyDown(int, android.view.KeyEvent);
    public boolean onKeyLongPress(int, android.view.KeyEvent);
    public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onKeyUp(int, android.view.KeyEvent);
    public void onLocalVoiceInteractionStarted();
    public void onLocalVoiceInteractionStopped();
    public void onLowMemory();
    public boolean onMenuItemSelected(int, android.view.MenuItem);
    public boolean onMenuOpened(int, android.view.Menu);
    public void onMovedToDisplay(int, android.content.res.Configuration);
    public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
    public void onMultiWindowModeChanged(boolean);
    public boolean onNavigateUp();
    public boolean onNavigateUpFromChild(android.app.Activity);
    public void onNewActivityOptions(android.app.ActivityOptions);
    protected void onNewIntent(android.content.Intent);
    public boolean onOptionsItemSelected(android.view.MenuItem);
    public void onOptionsMenuClosed(android.view.Menu);
    public void onPanelClosed(int, android.view.Menu);
    protected void onPause();
    public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
    public void onPictureInPictureModeChanged(boolean);
    protected void onPostCreate(android.os.Bundle);
    public void onPostCreate(android.os.Bundle, android.os.PersistableBundle);
    protected void onPostResume();
    protected void onPrepareDialog(int, android.app.Dialog);
    protected void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
    public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder);
    public boolean onPrepareOptionsMenu(android.view.Menu);
    public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    public void onProvideAssistContent(android.app.assist.AssistContent);
    public void onProvideAssistData(android.os.Bundle);
    public void onProvideKeyboardShortcuts(java.util.List, android.view.Menu, int);
    public android.net.Uri onProvideReferrer();
    public void onRequestPermissionsResult(int, java.lang.String[], int[]);
    protected void onRestart();
    protected void onRestoreInstanceState(android.os.Bundle);
    public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle);
    protected void onResume();
    public java.lang.Object onRetainNonConfigurationInstance();
    protected void onSaveInstanceState(android.os.Bundle);
    public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle);
    public boolean onSearchRequested(android.view.SearchEvent);
    public boolean onSearchRequested();
    protected void onStart();
    public void onStateNotSaved();
    protected void onStop();
    protected void onTitleChanged(java.lang.CharSequence, int);
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean onTrackballEvent(android.view.MotionEvent);
    public void onTrimMemory(int);
    public void onUserInteraction();
    protected void onUserLeaveHint();
    public void onVisibleBehindCanceled();
    public void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public void onWindowDismissed(boolean, boolean);
    public void onWindowFocusChanged(boolean);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
    public void openContextMenu(android.view.View);
    public void openOptionsMenu();
    public void overridePendingTransition(int, int);
    public void postponeEnterTransition();
    public void recreate();
    public void registerForContextMenu(android.view.View);
    public void registerRemoteAnimations(android.view.RemoteAnimationDefinition);
    public boolean releaseInstance();
    public void removeDialog(int);
    public void reportFullyDrawn();
    public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
    public void requestPermissions(java.lang.String[], int);
    public void requestShowKeyboardShortcuts();
    public boolean requestVisibleBehind(boolean);
    public boolean requestWindowFeature(int);
    public android.view.View requireViewById(int);
    public void runOnUiThread(java.lang.Runnable);
    public void setActionBar(android.widget.Toolbar);
    public void setContentTransitionManager(android.transition.TransitionManager);
    public void setContentView(int);
    public void setContentView(android.view.View);
    public void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void setDefaultKeyMode(int);
    public void setDisablePreviewScreenshots(boolean);
    public void setEnterSharedElementCallback(android.app.SharedElementCallback);
    public void setExitSharedElementCallback(android.app.SharedElementCallback);
    public void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    public void setFeatureDrawableAlpha(int, int);
    public void setFeatureDrawableResource(int, int);
    public void setFeatureDrawableUri(int, android.net.Uri);
    public void setFinishOnTouchOutside(boolean);
    public void setImmersive(boolean);
    public void setIntent(android.content.Intent);
    public void setMediaController(android.media.session.MediaController);
    public void setOverlayWithDecorCaptionEnabled(boolean);
    public void setPersistent(boolean);
    public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
    public void setPictureInPictureParams(android.app.PictureInPictureParams);
    public void setProgress(int);
    public void setProgressBarIndeterminate(boolean);
    public void setProgressBarIndeterminateVisibility(boolean);
    public void setProgressBarVisibility(boolean);
    public void setRequestedOrientation(int);
    public void setResult(int);
    public void setResult(int, android.content.Intent);
    public void setSecondaryProgress(int);
    public void setShowWhenLocked(boolean);
    public void setTaskDescription(android.app.ActivityManager$TaskDescription);
    public void setTheme(int);
    public void setTitle(java.lang.CharSequence);
    public void setTitle(int);
    public void setTitleColor(int);
    public void setTurnScreenOn(boolean);
    public void setVisible(boolean);
    public void setVolumeControlStream(int);
    public void setVrModeEnabled(boolean, android.content.ComponentName);
    public boolean shouldShowRequestPermissionRationale(java.lang.String);
    public boolean shouldUpRecreateTask(android.content.Intent);
    public boolean showAssist(android.os.Bundle);
    public void showDialog(int);
    public boolean showDialog(int, android.os.Bundle);
    public void showLockTaskEscapeMessage();
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback, int);
    public void startActivities(android.content.Intent[]);
    public void startActivities(android.content.Intent[], android.os.Bundle);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsCaller(android.content.Intent, android.os.Bundle, boolean, int);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public void startActivityAsUserFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResult(android.content.Intent, int);
    public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
    public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
    public void startActivityForResultAsUser(android.content.Intent, int, android.os.UserHandle);
    public void startActivityForResultAsUser(android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResultAsUser(android.content.Intent, java.lang.String, int, android.os.Bundle, android.os.UserHandle);
    public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
    public void startActivityFromChild(android.app.Activity, android.content.Intent, int, android.os.Bundle);
    public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int);
    public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
    public boolean startActivityIfNeeded(android.content.Intent, int);
    public boolean startActivityIfNeeded(android.content.Intent, int, android.os.Bundle);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int);
    public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int);
    public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startIntentSenderFromChildFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startLocalVoiceInteraction(android.os.Bundle);
    public void startLockTask();
    public void startManagingCursor(android.database.Cursor);
    public boolean startNextMatchingActivity(android.content.Intent);
    public boolean startNextMatchingActivity(android.content.Intent, android.os.Bundle);
    public void startPostponedEnterTransition();
    public void startSearch(java.lang.String, boolean, android.os.Bundle, boolean);
    public void stopLocalVoiceInteraction();
    public void stopLockTask();
    public void stopManagingCursor(android.database.Cursor);
    public void takeKeyEvents(boolean);
    public void triggerSearch(java.lang.String, android.os.Bundle);
    public void unregisterForContextMenu(android.view.View);


    public static int DEFAULT_KEYS_DIALER;
    public static int DEFAULT_KEYS_DISABLE;
    public static int DEFAULT_KEYS_SEARCH_GLOBAL;
    public static int DEFAULT_KEYS_SEARCH_LOCAL;
    public static int DEFAULT_KEYS_SHORTCUT;
    public static int DONT_FINISH_TASK_WITH_ACTIVITY;
    public static int FINISH_TASK_WITH_ACTIVITY;
    public static int FINISH_TASK_WITH_ROOT_ACTIVITY;
    protected static int[] FOCUSED_STATE_SET;
    public static int RESULT_CANCELED;
    public static int RESULT_FIRST_USER;
    public static int RESULT_OK;
}

-keep class android.app.Activity$NonConfigurationInstances {



}

-keep class android.app.Activity$TranslucentConversionListener {

    public abstract void onTranslucentConversionComplete(boolean);


}

-keep class android.app.ActivityManager {

    public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager$TaskDescription, android.graphics.Bitmap);
    public void addOnUidImportanceListener(android.app.ActivityManager$OnUidImportanceListener, int);
    public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
    public static void broadcastStickyIntent(android.content.Intent, int);
    public static void broadcastStickyIntent(android.content.Intent, int, int);
    public static int checkComponentPermission(java.lang.String, int, int, boolean);
    public static int checkUidPermission(java.lang.String, int);
    public boolean clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
    public boolean clearApplicationUserData();
    public void clearGrantedUriPermissions(java.lang.String);
    public void clearWatchHeapLimit();
    public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
    public static void dumpPackageStateStatic(java.io.FileDescriptor, java.lang.String);
    public void forceStopPackage(java.lang.String);
    public void forceStopPackageAsUser(java.lang.String, int);
    public android.util.Size getAppTaskThumbnailSize();
    public java.util.List getAppTasks();
    public static int getCurrentUser();
    public static int getDefaultAppRecentsLimitStatic();
    public android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
    public int getFrontActivityScreenCompatMode();
    public android.content.pm.ParceledListSlice getGrantedUriPermissions(java.lang.String);
    public int getLargeMemoryClass();
    public int getLauncherLargeIconDensity();
    public int getLauncherLargeIconSize();
    public int getLockTaskModeState();
    public static int getMaxAppRecentsLimitStatic();
    public static int getMaxNumPictureInPictureActions();
    public static int getMaxRecentTasksStatic();
    public int getMemoryClass();
    public void getMemoryInfo(android.app.ActivityManager$MemoryInfo);
    public static void getMyMemoryState(android.app.ActivityManager$RunningAppProcessInfo);
    public boolean getPackageAskScreenCompat(java.lang.String);
    public int getPackageImportance(java.lang.String);
    public int getPackageScreenCompatMode(java.lang.String);
    public android.os.Debug$MemoryInfo[] getProcessMemoryInfo(int[]);
    public java.util.List getProcessesInErrorState();
    public java.util.List getRecentTasks(int, int);
    public java.util.List getRunningAppProcesses();
    public java.util.List getRunningExternalApplications();
    public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName);
    public java.util.List getRunningServices(int);
    public java.util.List getRunningTasks(int);
    public static android.app.IActivityManager getService();
    public long getTotalRam();
    public int getUidImportance(int);
    public static int handleIncomingUser(int, int, int, boolean, boolean, java.lang.String, java.lang.String);
    public boolean isBackgroundRestricted();
    public static boolean isHighEndGfx();
    public boolean isInLockTaskMode();
    public boolean isLowRamDevice();
    public static boolean isLowRamDeviceStatic();
    public static boolean isProcStateBackground(int);
    public static boolean isRunningInTestHarness();
    public static boolean isSmallBatteryDevice();
    public static boolean isStartResultFatalError(int);
    public static boolean isStartResultSuccessful(int);
    public static boolean isSystemReady();
    public static boolean isUserAMonkey();
    public boolean isUserRunning(int);
    public boolean isVrModePackageEnabled(android.content.ComponentName);
    public void killBackgroundProcesses(java.lang.String);
    public void killUid(int, java.lang.String);
    public static void logoutCurrentUser();
    public void moveTaskToFront(int, int);
    public void moveTaskToFront(int, int, android.os.Bundle);
    public static void noteAlarmFinish(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String);
    public static void noteAlarmStart(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String);
    public static void noteWakeupAlarm(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String, java.lang.String);
    public static int processStateAmToProto(int);
    public void removeOnUidImportanceListener(android.app.ActivityManager$OnUidImportanceListener);
    public void removeStacksInWindowingModes(int[]);
    public void removeStacksWithActivityTypes(int[]);
    public void resizeStack(int, android.graphics.Rect);
    public void restartPackage(java.lang.String);
    public void setFrontActivityScreenCompatMode(int);
    public void setPackageAskScreenCompat(java.lang.String, boolean);
    public void setPackageScreenCompatMode(java.lang.String, int);
    public static void setPersistentVrThread(int);
    public boolean setProcessMemoryTrimLevel(java.lang.String, int, int);
    public void setTaskWindowingMode(int, int, boolean);
    public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean);
    public static void setVrThread(int);
    public void setWatchHeapLimit(long);
    public static int staticGetLargeMemoryClass();
    public static int staticGetMemoryClass();
    public static boolean supportsMultiWindow(android.content.Context);
    public static boolean supportsSplitScreenMultiWindow(android.content.Context);
    public boolean switchUser(int);


    public static java.lang.String ACTION_REPORT_HEAP_LIMIT;
    public static int APP_START_MODE_DELAYED;
    public static int APP_START_MODE_DELAYED_RIGID;
    public static int APP_START_MODE_DISABLED;
    public static int APP_START_MODE_NORMAL;
    public static int ASSIST_CONTEXT_AUTOFILL;
    public static int ASSIST_CONTEXT_BASIC;
    public static int ASSIST_CONTEXT_FULL;
    public static int BROADCAST_FAILED_USER_STOPPED;
    public static int BROADCAST_STICKY_CANT_HAVE_PERMISSION;
    public static int BROADCAST_SUCCESS;
    public static int BUGREPORT_OPTION_FULL;
    public static int BUGREPORT_OPTION_INTERACTIVE;
    public static int BUGREPORT_OPTION_REMOTE;
    public static int BUGREPORT_OPTION_TELEPHONY;
    public static int BUGREPORT_OPTION_WEAR;
    public static int BUGREPORT_OPTION_WIFI;
    public static int COMPAT_MODE_ALWAYS;
    public static int COMPAT_MODE_DISABLED;
    public static int COMPAT_MODE_ENABLED;
    public static int COMPAT_MODE_NEVER;
    public static int COMPAT_MODE_TOGGLE;
    public static int COMPAT_MODE_UNKNOWN;
    public static int FLAG_AND_LOCKED;
    public static int FLAG_AND_UNLOCKED;
    public static int FLAG_AND_UNLOCKING_OR_UNLOCKED;
    public static int FLAG_OR_STOPPED;
    public static int INTENT_SENDER_ACTIVITY;
    public static int INTENT_SENDER_ACTIVITY_RESULT;
    public static int INTENT_SENDER_BROADCAST;
    public static int INTENT_SENDER_FOREGROUND_SERVICE;
    public static int INTENT_SENDER_SERVICE;
    public static int LOCK_TASK_MODE_LOCKED;
    public static int LOCK_TASK_MODE_NONE;
    public static int LOCK_TASK_MODE_PINNED;
    public static int MAX_PROCESS_STATE;
    public static java.lang.String META_HOME_ALTERNATE;
    public static int MIN_PROCESS_STATE;
    public static int MOVE_TASK_NO_USER_ACTION;
    public static int MOVE_TASK_WITH_HOME;
    public static int PROCESS_STATE_BACKUP;
    public static int PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
    public static int PROCESS_STATE_CACHED_ACTIVITY;
    public static int PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
    public static int PROCESS_STATE_CACHED_EMPTY;
    public static int PROCESS_STATE_CACHED_RECENT;
    public static int PROCESS_STATE_FOREGROUND_SERVICE;
    public static int PROCESS_STATE_HEAVY_WEIGHT;
    public static int PROCESS_STATE_HOME;
    public static int PROCESS_STATE_IMPORTANT_BACKGROUND;
    public static int PROCESS_STATE_IMPORTANT_FOREGROUND;
    public static int PROCESS_STATE_LAST_ACTIVITY;
    public static int PROCESS_STATE_NONEXISTENT;
    public static int PROCESS_STATE_PERSISTENT;
    public static int PROCESS_STATE_PERSISTENT_UI;
    public static int PROCESS_STATE_RECEIVER;
    public static int PROCESS_STATE_SERVICE;
    public static int PROCESS_STATE_TOP;
    public static int PROCESS_STATE_TOP_SLEEPING;
    public static int PROCESS_STATE_TRANSIENT_BACKGROUND;
    public static int PROCESS_STATE_UNKNOWN;
    public static int RECENT_IGNORE_UNAVAILABLE;
    public static int RECENT_WITH_EXCLUDED;
    public static int RESIZE_MODE_FORCED;
    public static int RESIZE_MODE_PRESERVE_WINDOW;
    public static int RESIZE_MODE_SYSTEM;
    public static int RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
    public static int RESIZE_MODE_USER;
    public static int RESIZE_MODE_USER_FORCED;
    public static int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
    public static int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
    public static int START_ABORTED;
    public static int START_ASSISTANT_HIDDEN_SESSION;
    public static int START_ASSISTANT_NOT_ACTIVE_SESSION;
    public static int START_CANCELED;
    public static int START_CLASS_NOT_FOUND;
    public static int START_DELIVERED_TO_TOP;
    public static int START_FLAG_DEBUG;
    public static int START_FLAG_NATIVE_DEBUGGING;
    public static int START_FLAG_ONLY_IF_NEEDED;
    public static int START_FLAG_TRACK_ALLOCATION;
    public static int START_FORWARD_AND_REQUEST_CONFLICT;
    public static int START_INTENT_NOT_RESOLVED;
    public static int START_NOT_ACTIVITY;
    public static int START_NOT_CURRENT_USER_ACTIVITY;
    public static int START_NOT_VOICE_COMPATIBLE;
    public static int START_PERMISSION_DENIED;
    public static int START_RETURN_INTENT_TO_CALLER;
    public static int START_RETURN_LOCK_TASK_MODE_VIOLATION;
    public static int START_SUCCESS;
    public static int START_SWITCHES_CANCELED;
    public static int START_TASK_TO_FRONT;
    public static int START_VOICE_HIDDEN_SESSION;
    public static int START_VOICE_NOT_ACTIVE_SESSION;
    public static int UID_OBSERVER_ACTIVE;
    public static int UID_OBSERVER_CACHED;
    public static int UID_OBSERVER_GONE;
    public static int UID_OBSERVER_IDLE;
    public static int UID_OBSERVER_PROCSTATE;
    public static int USER_OP_ERROR_IS_SYSTEM;
    public static int USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
    public static int USER_OP_IS_CURRENT;
    public static int USER_OP_SUCCESS;
    public static int USER_OP_UNKNOWN_USER;
}

-keep class android.app.ActivityManager$AppTask {
    <init>(android.app.IAppTask);

    public void finishAndRemoveTask();
    public android.app.ActivityManager$RecentTaskInfo getTaskInfo();
    public void moveToFront();
    public void setExcludeFromRecents(boolean);
    public void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);


}

-keep class android.app.ActivityManager$MemoryInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public long availMem;
    public long foregroundAppThreshold;
    public long hiddenAppThreshold;
    public boolean lowMemory;
    public long secondaryServerThreshold;
    public long threshold;
    public long totalMem;
    public long visibleAppThreshold;
}

-keep class android.app.ActivityManager$OnUidImportanceListener {

    public abstract void onUidImportance(int, int);


}

-keep class android.app.ActivityManager$ProcessErrorStateInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static int CRASHED;
    public static android.os.Parcelable$Creator CREATOR;
    public static int NOT_RESPONDING;
    public static int NO_ERROR;
    public int condition;
    public byte[] crashData;
    public java.lang.String longMsg;
    public int pid;
    public java.lang.String processName;
    public java.lang.String shortMsg;
    public java.lang.String stackTrace;
    public java.lang.String tag;
    public int uid;
}

-keep class android.app.ActivityManager$RecentTaskInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int affiliatedTaskColor;
    public int affiliatedTaskId;
    public android.content.ComponentName baseActivity;
    public android.content.Intent baseIntent;
    public android.graphics.Rect bounds;
    public android.content.res.Configuration configuration;
    public java.lang.CharSequence description;
    public long firstActiveTime;
    public int id;
    public long lastActiveTime;
    public int numActivities;
    public android.content.ComponentName origActivity;
    public int persistentId;
    public android.content.ComponentName realActivity;
    public int resizeMode;
    public int stackId;
    public boolean supportsSplitScreenMultiWindow;
    public android.app.ActivityManager$TaskDescription taskDescription;
    public android.content.ComponentName topActivity;
    public int userId;
}

-keep class android.app.ActivityManager$RunningAppProcessInfo {
    <init>();
    <init>(java.lang.String, int, java.lang.String[]);

    public int describeContents();
    public static int importanceToProcState(int);
    public static int procStateToImportance(int);
    public static int procStateToImportanceForClient(int, android.content.Context);
    public static int procStateToImportanceForTargetSdk(int, int);
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_CANT_SAVE_STATE;
    public static int FLAG_HAS_ACTIVITIES;
    public static int FLAG_PERSISTENT;
    public static int IMPORTANCE_BACKGROUND;
    public static int IMPORTANCE_CACHED;
    public static int IMPORTANCE_CANT_SAVE_STATE;
    public static int IMPORTANCE_CANT_SAVE_STATE_PRE_26;
    public static int IMPORTANCE_EMPTY;
    public static int IMPORTANCE_FOREGROUND;
    public static int IMPORTANCE_FOREGROUND_SERVICE;
    public static int IMPORTANCE_GONE;
    public static int IMPORTANCE_PERCEPTIBLE;
    public static int IMPORTANCE_PERCEPTIBLE_PRE_26;
    public static int IMPORTANCE_SERVICE;
    public static int IMPORTANCE_TOP_SLEEPING;
    public static int IMPORTANCE_TOP_SLEEPING_PRE_28;
    public static int IMPORTANCE_VISIBLE;
    public static int REASON_PROVIDER_IN_USE;
    public static int REASON_SERVICE_IN_USE;
    public static int REASON_UNKNOWN;
    public int flags;
    public int importance;
    public int importanceReasonCode;
    public android.content.ComponentName importanceReasonComponent;
    public int importanceReasonImportance;
    public int importanceReasonPid;
    public int lastTrimLevel;
    public int lru;
    public int pid;
    public java.lang.String[] pkgList;
    public java.lang.String processName;
    public int processState;
    public int uid;
}

-keep class android.app.ActivityManager$RunningServiceInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_FOREGROUND;
    public static int FLAG_PERSISTENT_PROCESS;
    public static int FLAG_STARTED;
    public static int FLAG_SYSTEM_PROCESS;
    public long activeSince;
    public int clientCount;
    public int clientLabel;
    public java.lang.String clientPackage;
    public int crashCount;
    public int flags;
    public boolean foreground;
    public long lastActivityTime;
    public int pid;
    public java.lang.String process;
    public long restarting;
    public android.content.ComponentName service;
    public boolean started;
    public int uid;
}

-keep class android.app.ActivityManager$RunningTaskInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.ComponentName baseActivity;
    public android.content.res.Configuration configuration;
    public java.lang.CharSequence description;
    public int id;
    public long lastActiveTime;
    public int numActivities;
    public int numRunning;
    public int resizeMode;
    public int stackId;
    public boolean supportsSplitScreenMultiWindow;
    public android.graphics.Bitmap thumbnail;
    public android.content.ComponentName topActivity;
}

-keep class android.app.ActivityManager$StackInfo {
    <init>();

    public int describeContents();
    public void readFromParcel(android.os.Parcel);
    public java.lang.String toString(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.graphics.Rect bounds;
    public android.content.res.Configuration configuration;
    public int displayId;
    public int position;
    public int stackId;
    public android.graphics.Rect[] taskBounds;
    public int[] taskIds;
    public java.lang.String[] taskNames;
    public int[] taskUserIds;
    public android.content.ComponentName topActivity;
    public int userId;
    public boolean visible;
}

-keep class android.app.ActivityManager$TaskDescription {
    <init>(java.lang.String, android.graphics.Bitmap, int);
    <init>(java.lang.String, int, int);
    <init>(java.lang.String, android.graphics.Bitmap);
    <init>(java.lang.String, int);
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.String, android.graphics.Bitmap, int, java.lang.String, int, int, int, int);
    <init>(android.app.ActivityManager$TaskDescription);

    public void copyFrom(android.app.ActivityManager$TaskDescription);
    public void copyFromPreserveHiddenFields(android.app.ActivityManager$TaskDescription);
    public int describeContents();
    public int getBackgroundColor();
    public android.graphics.Bitmap getIcon();
    public java.lang.String getIconFilename();
    public int getIconResource();
    public android.graphics.Bitmap getInMemoryIcon();
    public java.lang.String getLabel();
    public int getNavigationBarColor();
    public int getPrimaryColor();
    public int getStatusBarColor();
    public static android.graphics.Bitmap loadTaskDescriptionIcon(java.lang.String, int);
    public void readFromParcel(android.os.Parcel);
    public void restoreFromXml(java.lang.String, java.lang.String);
    public void saveToXml(org.xmlpull.v1.XmlSerializer);
    public void setBackgroundColor(int);
    public void setIcon(android.graphics.Bitmap);
    public void setIcon(int);
    public void setIconFilename(java.lang.String);
    public void setLabel(java.lang.String);
    public void setNavigationBarColor(int);
    public void setPrimaryColor(int);
    public void setStatusBarColor(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ATTR_TASKDESCRIPTION_PREFIX;
    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ActivityManager$TaskSnapshot {
    <init>(android.graphics.GraphicBuffer, int, android.graphics.Rect, boolean, float, boolean, int, int, boolean);

    public int describeContents();
    public android.graphics.Rect getContentInsets();
    public int getOrientation();
    public float getScale();
    public android.graphics.GraphicBuffer getSnapshot();
    public int getSystemUiVisibility();
    public int getWindowingMode();
    public boolean isRealSnapshot();
    public boolean isReducedResolution();
    public boolean isTranslucent();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ActivityOptions {
    <init>(android.os.Bundle);

    public void abort();
    public static void abort(android.app.ActivityOptions);
    public boolean canTaskOverlayResume();
    public boolean disallowEnterPictureInPictureWhileLaunching();
    public android.app.ActivityOptions forTargetActivity();
    public static android.app.ActivityOptions fromBundle(android.os.Bundle);
    public android.view.AppTransitionAnimationSpec[] getAnimSpecs();
    public android.os.IRemoteCallback getAnimationFinishedListener();
    public int getAnimationType();
    public boolean getAvoidMoveToFront();
    public int getCustomEnterResId();
    public int getCustomExitResId();
    public int getCustomInPlaceResId();
    public int getExitCoordinatorKey();
    public int getHeight();
    public int getLaunchActivityType();
    public android.graphics.Rect getLaunchBounds();
    public int getLaunchDisplayId();
    public boolean getLaunchTaskBehind();
    public int getLaunchTaskId();
    public int getLaunchWindowingMode();
    public boolean getLockTaskMode();
    public android.os.IRemoteCallback getOnAnimationStartListener();
    public java.lang.String getPackageName();
    public android.view.RemoteAnimationAdapter getRemoteAnimationAdapter();
    public int getResultCode();
    public android.content.Intent getResultData();
    public android.os.ResultReceiver getResultReceiver();
    public int getRotationAnimationHint();
    public java.util.ArrayList getSharedElementNames();
    public android.view.IAppTransitionAnimationSpecsFuture getSpecsFuture();
    public int getSplitScreenCreateMode();
    public int getStartX();
    public int getStartY();
    public boolean getTaskOverlay();
    public android.graphics.GraphicBuffer getThumbnail();
    public android.app.PendingIntent getUsageTimeReport();
    public int getWidth();
    public boolean isReturning();
    public static android.app.ActivityOptions makeBasic();
    public static android.app.ActivityOptions makeClipRevealAnimation(android.view.View, int, int, int, int);
    public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int);
    public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int, android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener);
    public static android.app.ActivityOptions makeCustomInPlaceAnimation(android.content.Context, int);
    public static android.app.ActivityOptions makeMultiThumbFutureAspectScaleAnimation(android.content.Context, android.os.Handler, android.view.IAppTransitionAnimationSpecsFuture, android.app.ActivityOptions$OnAnimationStartedListener, boolean);
    public static android.app.ActivityOptions makeOpenCrossProfileAppsAnimation();
    public static android.app.ActivityOptions makeRemoteAnimation(android.view.RemoteAnimationAdapter);
    public static android.app.ActivityOptions makeScaleUpAnimation(android.view.View, int, int, int, int);
    public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
    public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.util.Pair[]);
    public static android.app.ActivityOptions makeTaskLaunchBehind();
    public static android.app.ActivityOptions makeThumbnailAspectScaleDownAnimation(android.view.View, android.graphics.Bitmap, int, int, int, int, android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener);
    public static android.app.ActivityOptions makeThumbnailAspectScaleDownAnimation(android.view.View, android.view.AppTransitionAnimationSpec[], android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener, android.app.ActivityOptions$OnAnimationFinishedListener);
    public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
    public android.os.Bundle popAppVerificationBundle();
    public void requestUsageTimeReport(android.app.PendingIntent);
    public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
    public void setAvoidMoveToFront();
    public void setDisallowEnterPictureInPictureWhileLaunching(boolean);
    public void setLaunchActivityType(int);
    public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
    public android.app.ActivityOptions setLaunchDisplayId(int);
    public void setLaunchTaskId(int);
    public void setLaunchWindowingMode(int);
    public android.app.ActivityOptions setLockTaskEnabled(boolean);
    public void setRemoteAnimationAdapter(android.view.RemoteAnimationAdapter);
    public void setRotationAnimationHint(int);
    public void setSplitScreenCreateMode(int);
    public void setTaskOverlay(boolean, boolean);
    public static android.app.ActivityOptions startSharedElementAnimation(android.view.Window, android.util.Pair[]);
    public static void stopSharedElementAnimation(android.view.Window);
    public android.os.Bundle toBundle();
    public java.lang.String toString();
    public void update(android.app.ActivityOptions);


    public static int ANIM_CLIP_REVEAL;
    public static int ANIM_CUSTOM;
    public static int ANIM_CUSTOM_IN_PLACE;
    public static int ANIM_DEFAULT;
    public static int ANIM_LAUNCH_TASK_BEHIND;
    public static int ANIM_NONE;
    public static int ANIM_OPEN_CROSS_PROFILE_APPS;
    public static int ANIM_REMOTE_ANIMATION;
    public static int ANIM_SCALE_UP;
    public static int ANIM_SCENE_TRANSITION;
    public static int ANIM_THUMBNAIL_ASPECT_SCALE_DOWN;
    public static int ANIM_THUMBNAIL_ASPECT_SCALE_UP;
    public static int ANIM_THUMBNAIL_SCALE_DOWN;
    public static int ANIM_THUMBNAIL_SCALE_UP;
    public static java.lang.String EXTRA_USAGE_TIME_REPORT;
    public static java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES;
    public static java.lang.String KEY_ANIM_ENTER_RES_ID;
    public static java.lang.String KEY_ANIM_EXIT_RES_ID;
    public static java.lang.String KEY_ANIM_HEIGHT;
    public static java.lang.String KEY_ANIM_IN_PLACE_RES_ID;
    public static java.lang.String KEY_ANIM_START_LISTENER;
    public static java.lang.String KEY_ANIM_START_X;
    public static java.lang.String KEY_ANIM_START_Y;
    public static java.lang.String KEY_ANIM_THUMBNAIL;
    public static java.lang.String KEY_ANIM_TYPE;
    public static java.lang.String KEY_ANIM_WIDTH;
    public static java.lang.String KEY_LAUNCH_BOUNDS;
    public static java.lang.String KEY_PACKAGE_NAME;
}

-keep class android.app.ActivityOptions$OnAnimationFinishedListener {

    public abstract void onAnimationFinished();


}

-keep class android.app.ActivityOptions$OnAnimationStartedListener {

    public abstract void onAnimationStarted();


}

-keep class android.app.ActivityThread {

    public android.content.IContentProvider acquireExistingProvider(android.content.Context, java.lang.String, int, boolean);
    public android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String, int, boolean);
    public void applyConfigurationToResources(android.content.res.Configuration);
    public static android.app.ActivityThread currentActivityThread();
    public static android.app.Application currentApplication();
    public static java.lang.String currentOpPackageName();
    public static java.lang.String currentPackageName();
    public static java.lang.String currentProcessName();
    public static void dumpMemInfoTable(java.io.PrintWriter, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, int, java.lang.String, long, long, long, long, long, long);
    public static void dumpMemInfoTable(android.util.proto.ProtoOutputStream, android.os.Debug$MemoryInfo, boolean, boolean, long, long, long, long, long, long);
    public android.app.Activity getActivity(android.os.IBinder);
    public android.app.ActivityThread$ActivityClientRecord getActivityClient(android.os.IBinder);
    public android.app.Application getApplication();
    public android.app.ActivityThread$ApplicationThread getApplicationThread();
    public java.util.concurrent.Executor getExecutor();
    public android.app.Instrumentation getInstrumentation();
    public int getIntCoreSetting(java.lang.String, int);
    public static android.content.Intent getIntentBeingBroadcast();
    public android.os.Looper getLooper();
    public android.app.LoadedApk getPackageInfo(java.lang.String, android.content.res.CompatibilityInfo, int);
    public android.app.LoadedApk getPackageInfo(java.lang.String, android.content.res.CompatibilityInfo, int, int);
    public android.app.LoadedApk getPackageInfo(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
    public android.app.LoadedApk getPackageInfoNoCheck(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public static android.content.pm.IPackageManager getPackageManager();
    public java.lang.String getProcessName();
    public java.lang.String getProfileFilePath();
    public android.app.ContextImpl getSystemContext();
    public android.app.ContextImpl getSystemUiContext();
    public void handleActivityConfigurationChanged(android.os.IBinder, android.content.res.Configuration, int);
    public void handleConfigurationChanged(android.content.res.Configuration);
    public void handleDestroyActivity(android.os.IBinder, boolean, int, boolean, java.lang.String);
    public void handleInstallProvider(android.content.pm.ProviderInfo);
    public android.app.Activity handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent);
    public void handleMultiWindowModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public void handleNewIntent(android.os.IBinder, java.util.List, boolean);
    public void handlePauseActivity(android.os.IBinder, boolean, boolean, int, android.app.servertransaction.PendingTransactionActions, java.lang.String);
    public void handlePictureInPictureModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public void handleRelaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public void handleRequestAssistContextExtras(android.app.ActivityThread$RequestAssistContextExtras);
    public void handleResumeActivity(android.os.IBinder, boolean, boolean, java.lang.String);
    public void handleSendResult(android.os.IBinder, java.util.List, java.lang.String);
    public void handleStartActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public void handleStopActivity(android.os.IBinder, boolean, int, android.app.servertransaction.PendingTransactionActions, boolean, java.lang.String);
    public void handleTranslucentConversionComplete(android.os.IBinder, boolean);
    public void handleWindowVisibility(android.os.IBinder, boolean);
    public void installSystemApplicationInfo(android.content.pm.ApplicationInfo, java.lang.ClassLoader);
    public void installSystemProviders(java.util.List);
    public boolean isProfiling();
    public static boolean isSystem();
    public static void main(java.lang.String[]);
    public void onNewActivityOptions(android.os.IBinder, android.app.ActivityOptions);
    public android.app.LoadedApk peekPackageInfo(java.lang.String, boolean);
    public void performRestartActivity(android.os.IBinder, boolean);
    public android.app.ActivityThread$ActivityClientRecord performResumeActivity(android.os.IBinder, boolean, java.lang.String);
    public android.app.ActivityThread$ActivityClientRecord prepareRelaunchActivity(android.os.IBinder, java.util.List, java.util.List, int, android.util.MergedConfiguration, boolean);
    public void registerOnActivityPausedListener(android.app.Activity, android.app.OnActivityPausedListener);
    public boolean releaseProvider(android.content.IContentProvider, boolean);
    public void reportRelaunch(android.os.IBinder, android.app.servertransaction.PendingTransactionActions);
    public void reportStop(android.app.servertransaction.PendingTransactionActions);
    public android.content.pm.ActivityInfo resolveActivityInfo(android.content.Intent);
    public void sendActivityResult(android.os.IBinder, java.lang.String, int, int, android.content.Intent);
    public android.app.Activity startActivityNow(android.app.Activity, java.lang.String, android.content.Intent, android.content.pm.ActivityInfo, android.os.IBinder, android.os.Bundle, android.app.Activity$NonConfigurationInstances);
    public void stopProfiling();
    public static android.app.ActivityThread systemMain();
    public void unregisterOnActivityPausedListener(android.app.Activity, android.app.OnActivityPausedListener);
    public void updatePendingConfiguration(android.content.res.Configuration);
    public void updateProcessState(int, boolean);


    public static boolean DEBUG_BROADCAST;
    public static boolean DEBUG_CONFIGURATION;
    public static boolean DEBUG_MEMORY_TRIM;
    public static boolean DEBUG_ORDER;
    public static long INVALID_PROC_STATE_SEQ;
    public static java.lang.String PROC_START_SEQ_IDENT;
    public static int SERVICE_DONE_EXECUTING_ANON;
    public static int SERVICE_DONE_EXECUTING_START;
    public static int SERVICE_DONE_EXECUTING_STOP;
    public static java.lang.String TAG;
}

-keep class android.app.ActivityThread$ActivityClientRecord {
    <init>();
    <init>(android.os.IBinder, android.content.Intent, int, android.content.pm.ActivityInfo, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.lang.String, com.android.internal.app.IVoiceInteractor, android.os.Bundle, android.os.PersistableBundle, java.util.List, java.util.List, boolean, android.app.ProfilerInfo, android.app.ClientTransactionHandler);

    public int getLifecycleState();
    public java.lang.String getStateString();
    public boolean isPersistable();
    public boolean isVisibleFromServer();
    public void setState(int);
    public java.lang.String toString();


    public boolean isForward;
    public android.app.LoadedApk packageInfo;
    public android.os.IBinder token;
}

-keep class android.app.ActivityThread$ApplicationThread {

    public void attachAgent(java.lang.String);
    public void bindApplication(java.lang.String, android.content.pm.ApplicationInfo, java.util.List, android.content.ComponentName, android.app.ProfilerInfo, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, boolean, boolean, boolean, boolean, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.util.Map, android.os.Bundle, java.lang.String, boolean);
    public void clearDnsCache();
    public void dispatchPackageBroadcast(int, java.lang.String[]);
    public void dumpActivity(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String, java.lang.String[]);
    public void dumpDbInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public void dumpGfxInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public void dumpHeap(boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
    public void dumpMemInfo(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, boolean, java.lang.String[]);
    public void dumpMemInfoProto(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, java.lang.String[]);
    public void dumpProvider(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public void dumpService(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public void handleTrustStorageUpdate();
    public void notifyCleartextNetwork(byte[]);
    public void processInBackground();
    public void profilerControl(boolean, android.app.ProfilerInfo, int);
    public void requestAssistContextExtras(android.os.IBinder, android.os.IBinder, int, int, int);
    public void runIsolatedEntryPoint(java.lang.String, java.lang.String[]);
    public void scheduleApplicationInfoChanged(android.content.pm.ApplicationInfo);
    public void scheduleBindService(android.os.IBinder, android.content.Intent, boolean, int);
    public void scheduleCrash(java.lang.String);
    public void scheduleCreateBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
    public void scheduleCreateService(android.os.IBinder, android.content.pm.ServiceInfo, android.content.res.CompatibilityInfo, int);
    public void scheduleDestroyBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public void scheduleEnterAnimationComplete(android.os.IBinder);
    public void scheduleExit();
    public void scheduleInstallProvider(android.content.pm.ProviderInfo);
    public void scheduleLocalVoiceInteractionStarted(android.os.IBinder, com.android.internal.app.IVoiceInteractor);
    public void scheduleLowMemory();
    public void scheduleOnNewActivityOptions(android.os.IBinder, android.os.Bundle);
    public void scheduleReceiver(android.content.Intent, android.content.pm.ActivityInfo, android.content.res.CompatibilityInfo, int, java.lang.String, android.os.Bundle, boolean, int, int);
    public void scheduleRegisteredReceiver(android.content.IIntentReceiver, android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int, int);
    public void scheduleServiceArgs(android.os.IBinder, android.content.pm.ParceledListSlice);
    public void scheduleSleeping(android.os.IBinder, boolean);
    public void scheduleStopService(android.os.IBinder);
    public void scheduleSuicide();
    public void scheduleTransaction(android.app.servertransaction.ClientTransaction);
    public void scheduleTranslucentConversionComplete(android.os.IBinder, boolean);
    public void scheduleTrimMemory(int);
    public void scheduleUnbindService(android.os.IBinder, android.content.Intent);
    public void setCoreSettings(android.os.Bundle);
    public void setHttpProxy(java.lang.String, java.lang.String, java.lang.String, android.net.Uri);
    public void setNetworkBlockSeq(long);
    public void setProcessState(int);
    public void setSchedulingGroup(int);
    public void startBinderTracking();
    public void stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
    public void unstableProviderDied(android.os.IBinder);
    public void updatePackageCompatibilityInfo(java.lang.String, android.content.res.CompatibilityInfo);
    public void updateProcessState(int, boolean);
    public void updateTimePrefs(int);
    public void updateTimeZone();


}

-keep class android.app.ActivityThread$RequestAssistContextExtras {



}

-keep class android.app.AppComponentFactory {
    <init>();

    public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
    public android.app.Application instantiateApplication(java.lang.ClassLoader, java.lang.String);
    public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
    public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
    public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);


    public static android.app.AppComponentFactory DEFAULT;
}

-keep class android.app.AppOpsManager {

    public int checkAudioOp(int, int, int, java.lang.String);
    public int checkAudioOpNoThrow(int, int, int, java.lang.String);
    public int checkOp(java.lang.String, int, java.lang.String);
    public int checkOp(int, int, java.lang.String);
    public int checkOpNoThrow(java.lang.String, int, java.lang.String);
    public int checkOpNoThrow(int, int, java.lang.String);
    public void checkPackage(int, java.lang.String);
    public void finishOp(java.lang.String, int, java.lang.String);
    public void finishOp(int, int, java.lang.String);
    public void finishOp(int);
    public static java.lang.String[] getOpStrs();
    public java.util.List getOpsForPackage(int, java.lang.String, int[]);
    public java.util.List getPackagesForOps(int[]);
    public static android.os.IBinder getToken(com.android.internal.app.IAppOpsService);
    public boolean isOperationActive(int, int, java.lang.String);
    public static long maxTime(long[], int, int);
    public static java.lang.String modeToName(int);
    public int noteOp(java.lang.String, int, java.lang.String);
    public int noteOp(int, int, java.lang.String);
    public int noteOp(int);
    public int noteOpNoThrow(java.lang.String, int, java.lang.String);
    public int noteOpNoThrow(int, int, java.lang.String);
    public int noteProxyOp(java.lang.String, java.lang.String);
    public int noteProxyOp(int, java.lang.String);
    public int noteProxyOpNoThrow(java.lang.String, java.lang.String);
    public int noteProxyOpNoThrow(int, java.lang.String);
    public static boolean opAllowSystemBypassRestriction(int);
    public static boolean opAllowsReset(int);
    public static int opToDefaultMode(int);
    public static java.lang.String opToName(int);
    public static java.lang.String opToPermission(int);
    public static java.lang.String opToRestriction(int);
    public static int opToSwitch(int);
    public static java.lang.String permissionToOp(java.lang.String);
    public static int permissionToOpCode(java.lang.String);
    public void resetAllModes();
    public void setMode(int, int, java.lang.String, int);
    public void setMode(java.lang.String, int, java.lang.String, int);
    public void setRestriction(int, int, int, java.lang.String[]);
    public void setUidMode(int, int, int);
    public void setUidMode(java.lang.String, int, int);
    public void setUserRestriction(int, boolean, android.os.IBinder);
    public void setUserRestriction(int, boolean, android.os.IBinder, java.lang.String[]);
    public void setUserRestrictionForUser(int, boolean, android.os.IBinder, java.lang.String[], int);
    public int startOp(java.lang.String, int, java.lang.String);
    public int startOp(int);
    public int startOp(int, int, java.lang.String);
    public int startOp(int, int, java.lang.String, boolean);
    public int startOpNoThrow(java.lang.String, int, java.lang.String);
    public int startOpNoThrow(int, int, java.lang.String);
    public int startOpNoThrow(int, int, java.lang.String, boolean);
    public void startWatchingActive(int[], android.app.AppOpsManager$OnOpActiveChangedListener);
    public void startWatchingMode(java.lang.String, java.lang.String, android.app.AppOpsManager$OnOpChangedListener);
    public void startWatchingMode(java.lang.String, java.lang.String, int, android.app.AppOpsManager$OnOpChangedListener);
    public void startWatchingMode(int, java.lang.String, android.app.AppOpsManager$OnOpChangedListener);
    public void startWatchingMode(int, java.lang.String, int, android.app.AppOpsManager$OnOpChangedListener);
    public void stopWatchingActive(android.app.AppOpsManager$OnOpActiveChangedListener);
    public void stopWatchingMode(android.app.AppOpsManager$OnOpChangedListener);
    public static int strDebugOpToOp(java.lang.String);
    public static int strOpToOp(java.lang.String);
    public int unsafeCheckOpRaw(java.lang.String, int, java.lang.String);


    public static int MODE_ALLOWED;
    public static int MODE_DEFAULT;
    public static int MODE_ERRORED;
    public static int MODE_FOREGROUND;
    public static int MODE_IGNORED;
    public static java.lang.String[] MODE_NAMES;
    public static java.lang.String OPSTR_ACCEPT_HANDOVER;
    public static java.lang.String OPSTR_ACCESS_NOTIFICATIONS;
    public static java.lang.String OPSTR_ACTIVATE_VPN;
    public static java.lang.String OPSTR_ADD_VOICEMAIL;
    public static java.lang.String OPSTR_ANSWER_PHONE_CALLS;
    public static java.lang.String OPSTR_ASSIST_SCREENSHOT;
    public static java.lang.String OPSTR_ASSIST_STRUCTURE;
    public static java.lang.String OPSTR_AUDIO_ACCESSIBILITY_VOLUME;
    public static java.lang.String OPSTR_AUDIO_ALARM_VOLUME;
    public static java.lang.String OPSTR_AUDIO_BLUETOOTH_VOLUME;
    public static java.lang.String OPSTR_AUDIO_MASTER_VOLUME;
    public static java.lang.String OPSTR_AUDIO_MEDIA_VOLUME;
    public static java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME;
    public static java.lang.String OPSTR_AUDIO_RING_VOLUME;
    public static java.lang.String OPSTR_AUDIO_VOICE_VOLUME;
    public static java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE;
    public static java.lang.String OPSTR_BLUETOOTH_SCAN;
    public static java.lang.String OPSTR_BODY_SENSORS;
    public static java.lang.String OPSTR_CALL_PHONE;
    public static java.lang.String OPSTR_CAMERA;
    public static java.lang.String OPSTR_CHANGE_WIFI_STATE;
    public static java.lang.String OPSTR_COARSE_LOCATION;
    public static java.lang.String OPSTR_FINE_LOCATION;
    public static java.lang.String OPSTR_GET_ACCOUNTS;
    public static java.lang.String OPSTR_GET_USAGE_STATS;
    public static java.lang.String OPSTR_GPS;
    public static java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND;
    public static java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS;
    public static java.lang.String OPSTR_MOCK_LOCATION;
    public static java.lang.String OPSTR_MONITOR_HIGH_POWER_LOCATION;
    public static java.lang.String OPSTR_MONITOR_LOCATION;
    public static java.lang.String OPSTR_MUTE_MICROPHONE;
    public static java.lang.String OPSTR_NEIGHBORING_CELLS;
    public static java.lang.String OPSTR_PICTURE_IN_PICTURE;
    public static java.lang.String OPSTR_PLAY_AUDIO;
    public static java.lang.String OPSTR_POST_NOTIFICATION;
    public static java.lang.String OPSTR_PROCESS_OUTGOING_CALLS;
    public static java.lang.String OPSTR_PROJECT_MEDIA;
    public static java.lang.String OPSTR_READ_CALENDAR;
    public static java.lang.String OPSTR_READ_CALL_LOG;
    public static java.lang.String OPSTR_READ_CELL_BROADCASTS;
    public static java.lang.String OPSTR_READ_CLIPBOARD;
    public static java.lang.String OPSTR_READ_CONTACTS;
    public static java.lang.String OPSTR_READ_EXTERNAL_STORAGE;
    public static java.lang.String OPSTR_READ_ICC_SMS;
    public static java.lang.String OPSTR_READ_PHONE_NUMBERS;
    public static java.lang.String OPSTR_READ_PHONE_STATE;
    public static java.lang.String OPSTR_READ_SMS;
    public static java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST;
    public static java.lang.String OPSTR_RECEIVE_MMS;
    public static java.lang.String OPSTR_RECEIVE_SMS;
    public static java.lang.String OPSTR_RECEIVE_WAP_PUSH;
    public static java.lang.String OPSTR_RECORD_AUDIO;
    public static java.lang.String OPSTR_REQUEST_DELETE_PACKAGES;
    public static java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES;
    public static java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND;
    public static java.lang.String OPSTR_RUN_IN_BACKGROUND;
    public static java.lang.String OPSTR_SEND_SMS;
    public static java.lang.String OPSTR_START_FOREGROUND;
    public static java.lang.String OPSTR_SYSTEM_ALERT_WINDOW;
    public static java.lang.String OPSTR_TAKE_AUDIO_FOCUS;
    public static java.lang.String OPSTR_TAKE_MEDIA_BUTTONS;
    public static java.lang.String OPSTR_TOAST_WINDOW;
    public static java.lang.String OPSTR_TURN_SCREEN_ON;
    public static java.lang.String OPSTR_USE_FINGERPRINT;
    public static java.lang.String OPSTR_USE_SIP;
    public static java.lang.String OPSTR_VIBRATE;
    public static java.lang.String OPSTR_WAKE_LOCK;
    public static java.lang.String OPSTR_WIFI_SCAN;
    public static java.lang.String OPSTR_WRITE_CALENDAR;
    public static java.lang.String OPSTR_WRITE_CALL_LOG;
    public static java.lang.String OPSTR_WRITE_CLIPBOARD;
    public static java.lang.String OPSTR_WRITE_CONTACTS;
    public static java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE;
    public static java.lang.String OPSTR_WRITE_ICC_SMS;
    public static java.lang.String OPSTR_WRITE_SETTINGS;
    public static java.lang.String OPSTR_WRITE_SMS;
    public static java.lang.String OPSTR_WRITE_WALLPAPER;
    public static int OP_ACCEPT_HANDOVER;
    public static int OP_ACCESS_NOTIFICATIONS;
    public static int OP_ACTIVATE_VPN;
    public static int OP_ADD_VOICEMAIL;
    public static int OP_ANSWER_PHONE_CALLS;
    public static int OP_ASSIST_SCREENSHOT;
    public static int OP_ASSIST_STRUCTURE;
    public static int OP_AUDIO_ACCESSIBILITY_VOLUME;
    public static int OP_AUDIO_ALARM_VOLUME;
    public static int OP_AUDIO_BLUETOOTH_VOLUME;
    public static int OP_AUDIO_MASTER_VOLUME;
    public static int OP_AUDIO_MEDIA_VOLUME;
    public static int OP_AUDIO_NOTIFICATION_VOLUME;
    public static int OP_AUDIO_RING_VOLUME;
    public static int OP_AUDIO_VOICE_VOLUME;
    public static int OP_BIND_ACCESSIBILITY_SERVICE;
    public static int OP_BLUETOOTH_SCAN;
    public static int OP_BODY_SENSORS;
    public static int OP_CALL_PHONE;
    public static int OP_CAMERA;
    public static int OP_CHANGE_WIFI_STATE;
    public static int OP_COARSE_LOCATION;
    public static int OP_FINE_LOCATION;
    public static int OP_GET_ACCOUNTS;
    public static int OP_GET_USAGE_STATS;
    public static int OP_GPS;
    public static int OP_INSTANT_APP_START_FOREGROUND;
    public static int OP_MANAGE_IPSEC_TUNNELS;
    public static int OP_MOCK_LOCATION;
    public static int OP_MONITOR_HIGH_POWER_LOCATION;
    public static int OP_MONITOR_LOCATION;
    public static int OP_MUTE_MICROPHONE;
    public static int OP_NEIGHBORING_CELLS;
    public static int OP_NONE;
    public static int OP_PICTURE_IN_PICTURE;
    public static int OP_PLAY_AUDIO;
    public static int OP_POST_NOTIFICATION;
    public static int OP_PROCESS_OUTGOING_CALLS;
    public static int OP_PROJECT_MEDIA;
    public static int OP_READ_CALENDAR;
    public static int OP_READ_CALL_LOG;
    public static int OP_READ_CELL_BROADCASTS;
    public static int OP_READ_CLIPBOARD;
    public static int OP_READ_CONTACTS;
    public static int OP_READ_EXTERNAL_STORAGE;
    public static int OP_READ_ICC_SMS;
    public static int OP_READ_PHONE_NUMBERS;
    public static int OP_READ_PHONE_STATE;
    public static int OP_READ_SMS;
    public static int OP_RECEIVE_EMERGECY_SMS;
    public static int OP_RECEIVE_MMS;
    public static int OP_RECEIVE_SMS;
    public static int OP_RECEIVE_WAP_PUSH;
    public static int OP_RECORD_AUDIO;
    public static int OP_REQUEST_DELETE_PACKAGES;
    public static int OP_REQUEST_INSTALL_PACKAGES;
    public static int OP_RUN_ANY_IN_BACKGROUND;
    public static int OP_RUN_IN_BACKGROUND;
    public static int OP_SEND_SMS;
    public static int OP_START_FOREGROUND;
    public static int OP_SYSTEM_ALERT_WINDOW;
    public static int OP_TAKE_AUDIO_FOCUS;
    public static int OP_TAKE_MEDIA_BUTTONS;
    public static int OP_TOAST_WINDOW;
    public static int OP_TURN_SCREEN_ON;
    public static int OP_USE_FINGERPRINT;
    public static int OP_USE_SIP;
    public static int OP_VIBRATE;
    public static int OP_WAKE_LOCK;
    public static int OP_WIFI_SCAN;
    public static int OP_WRITE_CALENDAR;
    public static int OP_WRITE_CALL_LOG;
    public static int OP_WRITE_CLIPBOARD;
    public static int OP_WRITE_CONTACTS;
    public static int OP_WRITE_EXTERNAL_STORAGE;
    public static int OP_WRITE_ICC_SMS;
    public static int OP_WRITE_SETTINGS;
    public static int OP_WRITE_SMS;
    public static int OP_WRITE_WALLPAPER;
    public static int UID_STATE_BACKGROUND;
    public static int UID_STATE_CACHED;
    public static int UID_STATE_FOREGROUND;
    public static int UID_STATE_FOREGROUND_SERVICE;
    public static int UID_STATE_LAST_NON_RESTRICTED;
    public static int UID_STATE_PERSISTENT;
    public static int UID_STATE_TOP;
    public static int WATCH_FOREGROUND_CHANGES;
    public static int _NUM_OP;
    public static int _NUM_UID_STATE;
}

-keep class android.app.AppOpsManager$OnOpActiveChangedListener {

    public abstract void onOpActiveChanged(int, int, java.lang.String, boolean);


}

-keep class android.app.AppOpsManager$OnOpChangedListener {

    public abstract void onOpChanged(java.lang.String, java.lang.String);


}

-keep class android.app.AppOpsManager$OpEntry {
    <init>(int, int, long, long, int, int, java.lang.String);
    <init>(int, int, long[], long[], int, boolean, int, java.lang.String);
    <init>(int, int, long[], long[], int, int, java.lang.String);

    public int describeContents();
    public int getDuration();
    public long getLastAccessBackgroundTime();
    public long getLastAccessForegroundTime();
    public long getLastAccessTime();
    public long getLastRejectBackgroundTime();
    public long getLastRejectForegroundTime();
    public long getLastRejectTime();
    public long getLastRejectTimeFor(int);
    public long getLastTimeFor(int);
    public int getMode();
    public int getOp();
    public java.lang.String getProxyPackageName();
    public int getProxyUid();
    public long getRejectTime();
    public long getTime();
    public boolean isRunning();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.AppOpsManager$PackageOps {
    <init>(java.lang.String, int, java.util.List);

    public int describeContents();
    public java.util.List getOps();
    public java.lang.String getPackageName();
    public int getUid();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.Application {
    <init>();

    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public static java.lang.String getProcessName();
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onCreate();
    public void onLowMemory();
    public void onTerminate();
    public void onTrimMemory(int);
    public void registerActivityLifecycleCallbacks(android.app.Application$ActivityLifecycleCallbacks);
    public void registerComponentCallbacks(android.content.ComponentCallbacks);
    public void registerOnProvideAssistDataListener(android.app.Application$OnProvideAssistDataListener);
    public void unregisterActivityLifecycleCallbacks(android.app.Application$ActivityLifecycleCallbacks);
    public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
    public void unregisterOnProvideAssistDataListener(android.app.Application$OnProvideAssistDataListener);


    public android.app.LoadedApk mLoadedApk;
}

-keep class android.app.Application$ActivityLifecycleCallbacks {

    public abstract void onActivityCreated(android.app.Activity, android.os.Bundle);
    public abstract void onActivityDestroyed(android.app.Activity);
    public abstract void onActivityPaused(android.app.Activity);
    public abstract void onActivityResumed(android.app.Activity);
    public abstract void onActivitySaveInstanceState(android.app.Activity, android.os.Bundle);
    public abstract void onActivityStarted(android.app.Activity);
    public abstract void onActivityStopped(android.app.Activity);


}

-keep class android.app.Application$OnProvideAssistDataListener {

    public abstract void onProvideAssistData(android.app.Activity, android.os.Bundle);


}

-keep class android.app.ApplicationErrorReport {
    <init>();

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public static android.content.ComponentName getErrorReportReceiver(android.content.Context, java.lang.String, int);
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_ANR;
    public static int TYPE_BATTERY;
    public static int TYPE_CRASH;
    public static int TYPE_NONE;
    public static int TYPE_RUNNING_SERVICE;
    public android.app.ApplicationErrorReport$AnrInfo anrInfo;
    public android.app.ApplicationErrorReport$BatteryInfo batteryInfo;
    public android.app.ApplicationErrorReport$CrashInfo crashInfo;
    public java.lang.String installerPackageName;
    public java.lang.String packageName;
    public java.lang.String processName;
    public android.app.ApplicationErrorReport$RunningServiceInfo runningServiceInfo;
    public boolean systemApp;
    public long time;
    public int type;
}

-keep class android.app.ApplicationErrorReport$AnrInfo {
    <init>();
    <init>(android.os.Parcel);

    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public java.lang.String activity;
    public java.lang.String cause;
    public java.lang.String info;
}

-keep class android.app.ApplicationErrorReport$BatteryInfo {
    <init>();
    <init>(android.os.Parcel);

    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public java.lang.String checkinDetails;
    public long durationMicros;
    public java.lang.String usageDetails;
    public int usagePercent;
}

-keep class android.app.ApplicationErrorReport$CrashInfo {
    <init>();
    <init>(java.lang.Throwable);
    <init>(android.os.Parcel);

    public void appendStackTrace(java.lang.String);
    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public java.lang.String exceptionClassName;
    public java.lang.String exceptionMessage;
    public java.lang.String stackTrace;
    public java.lang.String throwClassName;
    public java.lang.String throwFileName;
    public int throwLineNumber;
    public java.lang.String throwMethodName;
}

-keep class android.app.ApplicationErrorReport$ParcelableCrashInfo {
    <init>();
    <init>(java.lang.Throwable);
    <init>(android.os.Parcel);

    public int describeContents();


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ApplicationErrorReport$RunningServiceInfo {
    <init>();
    <init>(android.os.Parcel);

    public void dump(android.util.Printer, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public long durationMillis;
    public java.lang.String serviceDetails;
}

-keep class android.app.ClientTransactionHandler {
    <init>();

    public void executeTransaction(android.app.servertransaction.ClientTransaction);
    public abstract android.app.ActivityThread$ActivityClientRecord getActivityClient(android.os.IBinder);
    public abstract android.app.LoadedApk getPackageInfoNoCheck(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public abstract void handleActivityConfigurationChanged(android.os.IBinder, android.content.res.Configuration, int);
    public abstract void handleConfigurationChanged(android.content.res.Configuration);
    public abstract void handleDestroyActivity(android.os.IBinder, boolean, int, boolean, java.lang.String);
    public abstract android.app.Activity handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent);
    public abstract void handleMultiWindowModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public abstract void handleNewIntent(android.os.IBinder, java.util.List, boolean);
    public abstract void handlePauseActivity(android.os.IBinder, boolean, boolean, int, android.app.servertransaction.PendingTransactionActions, java.lang.String);
    public abstract void handlePictureInPictureModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
    public abstract void handleRelaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public abstract void handleResumeActivity(android.os.IBinder, boolean, boolean, java.lang.String);
    public abstract void handleSendResult(android.os.IBinder, java.util.List, java.lang.String);
    public abstract void handleStartActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
    public abstract void handleStopActivity(android.os.IBinder, boolean, int, android.app.servertransaction.PendingTransactionActions, boolean, java.lang.String);
    public abstract void handleWindowVisibility(android.os.IBinder, boolean);
    public abstract void performRestartActivity(android.os.IBinder, boolean);
    public abstract android.app.ActivityThread$ActivityClientRecord prepareRelaunchActivity(android.os.IBinder, java.util.List, java.util.List, int, android.util.MergedConfiguration, boolean);
    public abstract void reportRelaunch(android.os.IBinder, android.app.servertransaction.PendingTransactionActions);
    public abstract void reportStop(android.app.servertransaction.PendingTransactionActions);
    public abstract void updatePendingConfiguration(android.content.res.Configuration);
    public abstract void updateProcessState(int, boolean);


}

-keep class android.app.ContentProviderHolder {
    <init>(android.content.pm.ProviderInfo);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.os.IBinder connection;
    public android.content.pm.ProviderInfo info;
    public boolean noReleaseNeeded;
    public android.content.IContentProvider provider;
}

-keep class android.app.ContextImpl {

    public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
    public boolean canLoadUnsafeResources();
    public int checkCallingOrSelfPermission(java.lang.String);
    public int checkCallingOrSelfUriPermission(android.net.Uri, int);
    public int checkCallingPermission(java.lang.String);
    public int checkCallingUriPermission(android.net.Uri, int);
    public int checkPermission(java.lang.String, int, int);
    public int checkPermission(java.lang.String, int, int, android.os.IBinder);
    public int checkSelfPermission(java.lang.String);
    public int checkUriPermission(android.net.Uri, int, int, int);
    public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
    public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
    public void clearWallpaper();
    public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
    public android.content.Context createConfigurationContext(android.content.res.Configuration);
    public android.content.Context createContextForSplit(java.lang.String);
    public android.content.Context createCredentialProtectedStorageContext();
    public android.content.Context createDeviceProtectedStorageContext();
    public android.content.Context createDisplayContext(android.view.Display);
    public android.content.Context createPackageContext(java.lang.String, int);
    public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
    public java.lang.String[] databaseList();
    public boolean deleteDatabase(java.lang.String);
    public boolean deleteFile(java.lang.String);
    public boolean deleteSharedPreferences(java.lang.String);
    public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
    public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
    public void enforceCallingPermission(java.lang.String, java.lang.String);
    public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
    public void enforcePermission(java.lang.String, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
    public java.lang.String[] fileList();
    public android.os.IBinder getActivityToken();
    public android.content.Context getApplicationContext();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public android.content.res.AssetManager getAssets();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public java.lang.String getBasePackageName();
    public java.io.File getCacheDir();
    public java.lang.ClassLoader getClassLoader();
    public java.io.File getCodeCacheDir();
    public android.content.ContentResolver getContentResolver();
    public java.io.File getDataDir();
    public java.io.File getDatabasePath(java.lang.String);
    public java.io.File getDir(java.lang.String, int);
    public android.view.Display getDisplay();
    public android.view.DisplayAdjustments getDisplayAdjustments(int);
    public java.io.File getExternalCacheDir();
    public java.io.File[] getExternalCacheDirs();
    public java.io.File getExternalFilesDir(java.lang.String);
    public java.io.File[] getExternalFilesDirs(java.lang.String);
    public java.io.File[] getExternalMediaDirs();
    public java.io.File getFileStreamPath(java.lang.String);
    public java.io.File getFilesDir();
    public android.app.IApplicationThread getIApplicationThread();
    public java.util.concurrent.Executor getMainExecutor();
    public android.os.Looper getMainLooper();
    public android.os.Handler getMainThreadHandler();
    public java.io.File getNoBackupFilesDir();
    public java.io.File getObbDir();
    public java.io.File[] getObbDirs();
    public java.lang.String getOpPackageName();
    public java.lang.String getPackageCodePath();
    public android.content.pm.PackageManager getPackageManager();
    public java.lang.String getPackageName();
    public java.lang.String getPackageResourcePath();
    public java.io.File getPreloadsFileCache();
    public android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
    public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    public java.io.File getSharedPreferencesPath(java.lang.String);
    public java.lang.Object getSystemService(java.lang.String);
    public java.lang.String getSystemServiceName(java.lang.Class);
    public android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    public android.os.UserHandle getUser();
    public int getUserId();
    public android.graphics.drawable.Drawable getWallpaper();
    public int getWallpaperDesiredMinimumHeight();
    public int getWallpaperDesiredMinimumWidth();
    public void grantUriPermission(java.lang.String, android.net.Uri, int);
    public boolean isAutofillCompatibilityEnabled();
    public boolean isCredentialProtectedStorage();
    public boolean isDeviceProtectedStorage();
    public boolean isRestricted();
    public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
    public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
    public java.io.FileInputStream openFileInput(java.lang.String);
    public java.io.FileOutputStream openFileOutput(java.lang.String, int);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public android.graphics.drawable.Drawable peekWallpaper();
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
    public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public void reloadSharedPreferences();
    public void removeStickyBroadcast(android.content.Intent);
    public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void revokeUriPermission(android.net.Uri, int);
    public void revokeUriPermission(java.lang.String, android.net.Uri, int);
    public void sendBroadcast(android.content.Intent);
    public void sendBroadcast(android.content.Intent, java.lang.String);
    public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
    public void sendBroadcast(android.content.Intent, java.lang.String, int);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
    public void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
    public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyBroadcast(android.content.Intent);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
    public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
    public void setAutofillCompatibilityEnabled(boolean);
    public void setTheme(int);
    public void setWallpaper(android.graphics.Bitmap);
    public void setWallpaper(java.io.InputStream);
    public void startActivities(android.content.Intent[]);
    public void startActivities(android.content.Intent[], android.os.Bundle);
    public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public android.content.ComponentName startForegroundService(android.content.Intent);
    public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public android.content.ComponentName startService(android.content.Intent);
    public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean stopService(android.content.Intent);
    public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
    public void unbindService(android.content.ServiceConnection);
    public void unregisterReceiver(android.content.BroadcastReceiver);
    public void updateDisplay(int);


}

-keep class android.app.Dialog {
    <init>(android.content.Context);
    <init>(android.content.Context, int);
    <init>(android.content.Context, boolean, android.os.Message);
    <init>(android.content.Context, boolean, android.content.DialogInterface$OnCancelListener);

    public void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void cancel();
    public void closeOptionsMenu();
    public void create();
    public void dismiss();
    public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public android.view.View findViewById(int);
    public android.app.ActionBar getActionBar();
    public android.content.Context getContext();
    public android.view.View getCurrentFocus();
    public android.view.LayoutInflater getLayoutInflater();
    public android.app.Activity getOwnerActivity();
    public android.view.SearchEvent getSearchEvent();
    public int getVolumeControlStream();
    public android.view.Window getWindow();
    public void hide();
    public void invalidateOptionsMenu();
    public boolean isShowing();
    public void onActionModeFinished(android.view.ActionMode);
    public void onActionModeStarted(android.view.ActionMode);
    public void onAttachedToWindow();
    public void onBackPressed();
    public void onContentChanged();
    public boolean onContextItemSelected(android.view.MenuItem);
    public void onContextMenuClosed(android.view.Menu);
    protected void onCreate(android.os.Bundle);
    public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
    public boolean onCreateOptionsMenu(android.view.Menu);
    public boolean onCreatePanelMenu(int, android.view.Menu);
    public android.view.View onCreatePanelView(int);
    public void onDetachedFromWindow();
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public boolean onKeyDown(int, android.view.KeyEvent);
    public boolean onKeyLongPress(int, android.view.KeyEvent);
    public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onKeyUp(int, android.view.KeyEvent);
    public boolean onMenuItemSelected(int, android.view.MenuItem);
    public boolean onMenuOpened(int, android.view.Menu);
    public boolean onOptionsItemSelected(android.view.MenuItem);
    public void onOptionsMenuClosed(android.view.Menu);
    public void onPanelClosed(int, android.view.Menu);
    public boolean onPrepareOptionsMenu(android.view.Menu);
    public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    public void onRestoreInstanceState(android.os.Bundle);
    public android.os.Bundle onSaveInstanceState();
    public boolean onSearchRequested(android.view.SearchEvent);
    public boolean onSearchRequested();
    protected void onStart();
    protected void onStop();
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean onTrackballEvent(android.view.MotionEvent);
    public void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public void onWindowDismissed(boolean, boolean);
    public void onWindowFocusChanged(boolean);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
    public void openContextMenu(android.view.View);
    public void openOptionsMenu();
    public void registerForContextMenu(android.view.View);
    public boolean requestWindowFeature(int);
    public android.view.View requireViewById(int);
    public void setCancelMessage(android.os.Message);
    public void setCancelable(boolean);
    public void setCanceledOnTouchOutside(boolean);
    public void setContentView(int);
    public void setContentView(android.view.View);
    public void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void setDismissMessage(android.os.Message);
    public void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    public void setFeatureDrawableAlpha(int, int);
    public void setFeatureDrawableResource(int, int);
    public void setFeatureDrawableUri(int, android.net.Uri);
    public void setOnCancelListener(android.content.DialogInterface$OnCancelListener);
    public void setOnDismissListener(android.content.DialogInterface$OnDismissListener);
    public void setOnKeyListener(android.content.DialogInterface$OnKeyListener);
    public void setOnShowListener(android.content.DialogInterface$OnShowListener);
    public void setOwnerActivity(android.app.Activity);
    public void setTitle(java.lang.CharSequence);
    public void setTitle(int);
    public void setVolumeControlStream(int);
    public void show();
    public boolean takeCancelAndDismissListeners(java.lang.String, android.content.DialogInterface$OnCancelListener, android.content.DialogInterface$OnDismissListener);
    public void takeKeyEvents(boolean);
    public void unregisterForContextMenu(android.view.View);


    protected boolean mCancelable;
}

-keep class android.app.Fragment {
    <init>();

    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public boolean equals(java.lang.Object);
    public android.app.Activity getActivity();
    public boolean getAllowEnterTransitionOverlap();
    public boolean getAllowReturnTransitionOverlap();
    public android.os.Bundle getArguments();
    public android.app.FragmentManager getChildFragmentManager();
    public android.content.Context getContext();
    public android.transition.Transition getEnterTransition();
    public android.transition.Transition getExitTransition();
    public android.app.FragmentManager getFragmentManager();
    public java.lang.Object getHost();
    public int getId();
    public android.view.LayoutInflater getLayoutInflater();
    public android.app.LoaderManager getLoaderManager();
    public android.app.Fragment getParentFragment();
    public android.transition.Transition getReenterTransition();
    public android.content.res.Resources getResources();
    public boolean getRetainInstance();
    public android.transition.Transition getReturnTransition();
    public android.transition.Transition getSharedElementEnterTransition();
    public android.transition.Transition getSharedElementReturnTransition();
    public java.lang.String getString(int);
    public java.lang.String getString(int, java.lang.Object[]);
    public java.lang.String getTag();
    public android.app.Fragment getTargetFragment();
    public int getTargetRequestCode();
    public java.lang.CharSequence getText(int);
    public boolean getUserVisibleHint();
    public android.view.View getView();
    public int hashCode();
    public static android.app.Fragment instantiate(android.content.Context, java.lang.String);
    public static android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
    public boolean isAdded();
    public boolean isDetached();
    public boolean isHidden();
    public boolean isInLayout();
    public boolean isRemoving();
    public boolean isResumed();
    public boolean isStateSaved();
    public boolean isVisible();
    public void onActivityCreated(android.os.Bundle);
    public void onActivityResult(int, int, android.content.Intent);
    public void onAttach(android.content.Context);
    public void onAttach(android.app.Activity);
    public void onAttachFragment(android.app.Fragment);
    public void onConfigurationChanged(android.content.res.Configuration);
    public boolean onContextItemSelected(android.view.MenuItem);
    public void onCreate(android.os.Bundle);
    public android.animation.Animator onCreateAnimator(int, boolean, int);
    public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
    public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
    public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
    public void onDestroy();
    public void onDestroyOptionsMenu();
    public void onDestroyView();
    public void onDetach();
    public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
    public void onHiddenChanged(boolean);
    public void onInflate(android.util.AttributeSet, android.os.Bundle);
    public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
    public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
    public void onLowMemory();
    public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
    public void onMultiWindowModeChanged(boolean);
    public boolean onOptionsItemSelected(android.view.MenuItem);
    public void onOptionsMenuClosed(android.view.Menu);
    public void onPause();
    public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
    public void onPictureInPictureModeChanged(boolean);
    public void onPrepareOptionsMenu(android.view.Menu);
    public void onRequestPermissionsResult(int, java.lang.String[], int[]);
    public void onResume();
    public void onSaveInstanceState(android.os.Bundle);
    public void onStart();
    public void onStop();
    public void onTrimMemory(int);
    public void onViewCreated(android.view.View, android.os.Bundle);
    public void onViewStateRestored(android.os.Bundle);
    public void postponeEnterTransition();
    public void registerForContextMenu(android.view.View);
    public void requestPermissions(java.lang.String[], int);
    public void setAllowEnterTransitionOverlap(boolean);
    public void setAllowReturnTransitionOverlap(boolean);
    public void setArguments(android.os.Bundle);
    public void setEnterSharedElementCallback(android.app.SharedElementCallback);
    public void setEnterTransition(android.transition.Transition);
    public void setExitSharedElementCallback(android.app.SharedElementCallback);
    public void setExitTransition(android.transition.Transition);
    public void setHasOptionsMenu(boolean);
    public void setInitialSavedState(android.app.Fragment$SavedState);
    public void setMenuVisibility(boolean);
    public void setReenterTransition(android.transition.Transition);
    public void setRetainInstance(boolean);
    public void setReturnTransition(android.transition.Transition);
    public void setSharedElementEnterTransition(android.transition.Transition);
    public void setSharedElementReturnTransition(android.transition.Transition);
    public void setTargetFragment(android.app.Fragment, int);
    public void setUserVisibleHint(boolean);
    public boolean shouldShowRequestPermissionRationale(java.lang.String);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityForResult(android.content.Intent, int);
    public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
    public void startActivityForResultAsUser(android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public void startPostponedEnterTransition();
    public java.lang.String toString();
    public void unregisterForContextMenu(android.view.View);


}

-keep class android.app.Fragment$SavedState {

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$ClassLoaderCreator CREATOR;
}

-keep class android.app.FragmentContainer {
    <init>();

    public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
    public abstract android.view.View onFindViewById(int);
    public abstract boolean onHasView();


}

-keep class android.app.FragmentHostCallback {
    <init>(android.content.Context, android.os.Handler, int);

    public void onAttachFragment(android.app.Fragment);
    public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public android.view.View onFindViewById(int);
    public abstract java.lang.Object onGetHost();
    public android.view.LayoutInflater onGetLayoutInflater();
    public int onGetWindowAnimations();
    public boolean onHasView();
    public boolean onHasWindowAnimations();
    public void onInvalidateOptionsMenu();
    public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
    public boolean onShouldSaveFragmentState(android.app.Fragment);
    public void onStartActivityAsUserFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
    public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
    public boolean onUseFragmentManagerInflaterFactory();


}

-keep class android.app.FragmentManager {
    <init>();

    public abstract void addOnBackStackChangedListener(android.app.FragmentManager$OnBackStackChangedListener);
    public abstract android.app.FragmentTransaction beginTransaction();
    public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public static void enableDebugLogging(boolean);
    public abstract boolean executePendingTransactions();
    public abstract android.app.Fragment findFragmentById(int);
    public abstract android.app.Fragment findFragmentByTag(java.lang.String);
    public abstract android.app.FragmentManager$BackStackEntry getBackStackEntryAt(int);
    public abstract int getBackStackEntryCount();
    public abstract android.app.Fragment getFragment(android.os.Bundle, java.lang.String);
    public abstract java.util.List getFragments();
    public abstract android.app.Fragment getPrimaryNavigationFragment();
    public void invalidateOptionsMenu();
    public abstract boolean isDestroyed();
    public abstract boolean isStateSaved();
    public android.app.FragmentTransaction openTransaction();
    public abstract void popBackStack();
    public abstract void popBackStack(java.lang.String, int);
    public abstract void popBackStack(int, int);
    public abstract boolean popBackStackImmediate();
    public abstract boolean popBackStackImmediate(java.lang.String, int);
    public abstract boolean popBackStackImmediate(int, int);
    public abstract void putFragment(android.os.Bundle, java.lang.String, android.app.Fragment);
    public abstract void registerFragmentLifecycleCallbacks(android.app.FragmentManager$FragmentLifecycleCallbacks, boolean);
    public abstract void removeOnBackStackChangedListener(android.app.FragmentManager$OnBackStackChangedListener);
    public abstract android.app.Fragment$SavedState saveFragmentInstanceState(android.app.Fragment);
    public abstract void unregisterFragmentLifecycleCallbacks(android.app.FragmentManager$FragmentLifecycleCallbacks);


    public static int POP_BACK_STACK_INCLUSIVE;
}

-keep class android.app.FragmentManager$BackStackEntry {

    public abstract java.lang.CharSequence getBreadCrumbShortTitle();
    public abstract int getBreadCrumbShortTitleRes();
    public abstract java.lang.CharSequence getBreadCrumbTitle();
    public abstract int getBreadCrumbTitleRes();
    public abstract int getId();
    public abstract java.lang.String getName();


}

-keep class android.app.FragmentManager$FragmentLifecycleCallbacks {
    <init>();

    public void onFragmentActivityCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
    public void onFragmentCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentDestroyed(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
    public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
    public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentStopped(android.app.FragmentManager, android.app.Fragment);
    public void onFragmentViewCreated(android.app.FragmentManager, android.app.Fragment, android.view.View, android.os.Bundle);
    public void onFragmentViewDestroyed(android.app.FragmentManager, android.app.Fragment);


}

-keep class android.app.FragmentManager$OnBackStackChangedListener {

    public abstract void onBackStackChanged();


}

-keep class android.app.FragmentTransaction {
    <init>();

    public abstract android.app.FragmentTransaction add(android.app.Fragment, java.lang.String);
    public abstract android.app.FragmentTransaction add(int, android.app.Fragment);
    public abstract android.app.FragmentTransaction add(int, android.app.Fragment, java.lang.String);
    public abstract android.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
    public abstract android.app.FragmentTransaction addToBackStack(java.lang.String);
    public abstract android.app.FragmentTransaction attach(android.app.Fragment);
    public abstract int commit();
    public abstract int commitAllowingStateLoss();
    public abstract void commitNow();
    public abstract void commitNowAllowingStateLoss();
    public abstract android.app.FragmentTransaction detach(android.app.Fragment);
    public abstract android.app.FragmentTransaction disallowAddToBackStack();
    public abstract android.app.FragmentTransaction hide(android.app.Fragment);
    public abstract boolean isAddToBackStackAllowed();
    public abstract boolean isEmpty();
    public abstract android.app.FragmentTransaction remove(android.app.Fragment);
    public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
    public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
    public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
    public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
    public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
    public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
    public abstract android.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
    public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
    public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
    public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
    public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
    public abstract android.app.FragmentTransaction setTransition(int);
    public abstract android.app.FragmentTransaction setTransitionStyle(int);
    public abstract android.app.FragmentTransaction show(android.app.Fragment);


    public static int TRANSIT_ENTER_MASK;
    public static int TRANSIT_EXIT_MASK;
    public static int TRANSIT_FRAGMENT_CLOSE;
    public static int TRANSIT_FRAGMENT_FADE;
    public static int TRANSIT_FRAGMENT_OPEN;
    public static int TRANSIT_NONE;
    public static int TRANSIT_UNSET;
}

-keep class android.app.GrantedUriPermission {
    <init>(android.net.Uri, java.lang.String);

    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String packageName;
    public android.net.Uri uri;
}

-keep class android.app.IActivityController {

    public abstract boolean activityResuming(java.lang.String);
    public abstract boolean activityStarting(android.content.Intent, java.lang.String);
    public abstract boolean appCrashed(java.lang.String, int, java.lang.String, java.lang.String, long, java.lang.String);
    public abstract int appEarlyNotResponding(java.lang.String, int, java.lang.String);
    public abstract int appNotResponding(java.lang.String, int, java.lang.String);
    public abstract int systemNotResponding(java.lang.String);


}

-keep class android.app.IActivityManager {

    public abstract void activityDestroyed(android.os.IBinder);
    public abstract void activityIdle(android.os.IBinder, android.content.res.Configuration, boolean);
    public abstract void activityPaused(android.os.IBinder);
    public abstract void activityRelaunched(android.os.IBinder);
    public abstract void activityResumed(android.os.IBinder);
    public abstract void activitySlept(android.os.IBinder);
    public abstract void activityStopped(android.os.IBinder, android.os.Bundle, android.os.PersistableBundle, java.lang.CharSequence);
    public abstract int addAppTask(android.os.IBinder, android.content.Intent, android.app.ActivityManager$TaskDescription, android.graphics.Bitmap);
    public abstract void addInstrumentationResults(android.app.IApplicationThread, android.os.Bundle);
    public abstract void addPackageDependency(java.lang.String);
    public abstract void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
    public abstract void appNotRespondingViaProvider(android.os.IBinder);
    public abstract void attachApplication(android.app.IApplicationThread, long);
    public abstract void backgroundWhitelistUid(int);
    public abstract void backupAgentCreated(java.lang.String, android.os.IBinder);
    public abstract boolean bindBackupAgent(java.lang.String, int, int);
    public abstract int bindService(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, int);
    public abstract void bootAnimationComplete();
    public abstract int broadcastIntent(android.app.IApplicationThread, android.content.Intent, java.lang.String, android.content.IIntentReceiver, int, java.lang.String, android.os.Bundle, java.lang.String[], int, android.os.Bundle, boolean, boolean, int);
    public abstract void cancelIntentSender(android.content.IIntentSender);
    public abstract void cancelRecentsAnimation(boolean);
    public abstract void cancelTaskWindowTransition(int);
    public abstract int checkGrantUriPermission(int, java.lang.String, android.net.Uri, int, int);
    public abstract int checkPermission(java.lang.String, int, int);
    public abstract int checkPermissionWithToken(java.lang.String, int, int, android.os.IBinder);
    public abstract int checkUriPermission(android.net.Uri, int, int, int, int, android.os.IBinder);
    public abstract boolean clearApplicationUserData(java.lang.String, boolean, android.content.pm.IPackageDataObserver, int);
    public abstract void clearGrantedUriPermissions(java.lang.String, int);
    public abstract void clearPendingBackup();
    public abstract void closeSystemDialogs(java.lang.String);
    public abstract boolean convertFromTranslucent(android.os.IBinder);
    public abstract boolean convertToTranslucent(android.os.IBinder, android.os.Bundle);
    public abstract void crashApplication(int, int, java.lang.String, int, java.lang.String);
    public abstract int createStackOnDisplay(int);
    public abstract void dismissKeyguard(android.os.IBinder, com.android.internal.policy.IKeyguardDismissCallback, java.lang.CharSequence);
    public abstract void dismissPip(boolean, int);
    public abstract void dismissSplitScreenMode(boolean);
    public abstract boolean dumpHeap(java.lang.String, int, boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
    public abstract void dumpHeapFinished(java.lang.String);
    public abstract boolean enterPictureInPictureMode(android.os.IBinder, android.app.PictureInPictureParams);
    public abstract void enterSafeMode();
    public abstract void exitFreeformMode(android.os.IBinder);
    public abstract boolean finishActivity(android.os.IBinder, int, android.content.Intent, int);
    public abstract boolean finishActivityAffinity(android.os.IBinder);
    public abstract void finishHeavyWeightApp();
    public abstract void finishInstrumentation(android.app.IApplicationThread, int, android.os.Bundle);
    public abstract void finishReceiver(android.os.IBinder, int, java.lang.String, android.os.Bundle, boolean, int);
    public abstract void finishSubActivity(android.os.IBinder, java.lang.String, int);
    public abstract void finishVoiceTask(android.service.voice.IVoiceInteractionSession);
    public abstract void forceStopPackage(java.lang.String, int);
    public abstract android.content.ComponentName getActivityClassForToken(android.os.IBinder);
    public abstract int getActivityDisplayId(android.os.IBinder);
    public abstract android.os.Bundle getActivityOptions(android.os.IBinder);
    public abstract java.util.List getAllStackInfos();
    public abstract android.graphics.Point getAppTaskThumbnailSize();
    public abstract java.util.List getAppTasks(java.lang.String);
    public abstract android.os.Bundle getAssistContextExtras(int);
    public abstract android.content.ComponentName getCallingActivity(android.os.IBinder);
    public abstract java.lang.String getCallingPackage(android.os.IBinder);
    public abstract android.content.res.Configuration getConfiguration();
    public abstract android.app.ContentProviderHolder getContentProvider(android.app.IApplicationThread, java.lang.String, int, boolean);
    public abstract android.app.ContentProviderHolder getContentProviderExternal(java.lang.String, int, android.os.IBinder);
    public abstract android.content.pm.UserInfo getCurrentUser();
    public abstract android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
    public abstract java.util.List getFilteredTasks(int, int, int);
    public abstract android.app.ActivityManager$StackInfo getFocusedStackInfo();
    public abstract int getFrontActivityScreenCompatMode();
    public abstract android.content.pm.ParceledListSlice getGrantedUriPermissions(java.lang.String, int);
    public abstract android.content.Intent getIntentForIntentSender(android.content.IIntentSender);
    public abstract android.content.IIntentSender getIntentSender(int, java.lang.String, android.os.IBinder, java.lang.String, int, android.content.Intent[], java.lang.String[], int, android.os.Bundle, int);
    public abstract int getLastResumedActivityUserId();
    public abstract java.lang.String getLaunchedFromPackage(android.os.IBinder);
    public abstract int getLaunchedFromUid(android.os.IBinder);
    public abstract int getLockTaskModeState();
    public abstract int getMaxNumPictureInPictureActions(android.os.IBinder);
    public abstract void getMemoryInfo(android.app.ActivityManager$MemoryInfo);
    public abstract int getMemoryTrimLevel();
    public abstract void getMyMemoryState(android.app.ActivityManager$RunningAppProcessInfo);
    public abstract boolean getPackageAskScreenCompat(java.lang.String);
    public abstract java.lang.String getPackageForIntentSender(android.content.IIntentSender);
    public abstract java.lang.String getPackageForToken(android.os.IBinder);
    public abstract int getPackageProcessState(java.lang.String, java.lang.String);
    public abstract int getPackageScreenCompatMode(java.lang.String);
    public abstract android.content.pm.ParceledListSlice getPersistedUriPermissions(java.lang.String, boolean);
    public abstract int getProcessLimit();
    public abstract android.os.Debug$MemoryInfo[] getProcessMemoryInfo(int[]);
    public abstract long[] getProcessPss(int[]);
    public abstract java.util.List getProcessesInErrorState();
    public abstract java.lang.String getProviderMimeType(android.net.Uri, int);
    public abstract android.content.pm.ParceledListSlice getRecentTasks(int, int, int);
    public abstract int getRequestedOrientation(android.os.IBinder);
    public abstract java.util.List getRunningAppProcesses();
    public abstract java.util.List getRunningExternalApplications();
    public abstract android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName);
    public abstract int[] getRunningUserIds();
    public abstract java.util.List getServices(int, int);
    public abstract android.app.ActivityManager$StackInfo getStackInfo(int, int);
    public abstract java.lang.String getTagForIntentSender(android.content.IIntentSender, java.lang.String);
    public abstract android.graphics.Rect getTaskBounds(int);
    public abstract android.app.ActivityManager$TaskDescription getTaskDescription(int);
    public abstract android.graphics.Bitmap getTaskDescriptionIcon(java.lang.String, int);
    public abstract int getTaskForActivity(android.os.IBinder, boolean);
    public abstract android.app.ActivityManager$TaskSnapshot getTaskSnapshot(int, boolean);
    public abstract java.util.List getTasks(int);
    public abstract int getUidForIntentSender(android.content.IIntentSender);
    public abstract int getUidProcessState(int, java.lang.String);
    public abstract android.os.IBinder getUriPermissionOwnerForActivity(android.os.IBinder);
    public abstract void grantUriPermission(android.app.IApplicationThread, java.lang.String, android.net.Uri, int, int);
    public abstract void grantUriPermissionFromOwner(android.os.IBinder, int, java.lang.String, android.net.Uri, int, int, int);
    public abstract void handleApplicationCrash(android.os.IBinder, android.app.ApplicationErrorReport$ParcelableCrashInfo);
    public abstract void handleApplicationStrictModeViolation(android.os.IBinder, int, android.os.StrictMode$ViolationInfo);
    public abstract boolean handleApplicationWtf(android.os.IBinder, java.lang.String, boolean, android.app.ApplicationErrorReport$ParcelableCrashInfo);
    public abstract int handleIncomingUser(int, int, int, boolean, boolean, java.lang.String, java.lang.String);
    public abstract void hang(android.os.IBinder, boolean);
    public abstract long inputDispatchingTimedOut(int, boolean, java.lang.String);
    public abstract boolean isAppForeground(int);
    public abstract boolean isAppStartModeDisabled(int, java.lang.String);
    public abstract boolean isAssistDataAllowedOnCurrentActivity();
    public abstract boolean isBackgroundRestricted(java.lang.String);
    public abstract boolean isImmersive(android.os.IBinder);
    public abstract boolean isInLockTaskMode();
    public abstract boolean isInMultiWindowMode(android.os.IBinder);
    public abstract boolean isInPictureInPictureMode(android.os.IBinder);
    public abstract boolean isIntentSenderAForegroundService(android.content.IIntentSender);
    public abstract boolean isIntentSenderAnActivity(android.content.IIntentSender);
    public abstract boolean isIntentSenderTargetedToPackage(android.content.IIntentSender);
    public abstract boolean isRootVoiceInteraction(android.os.IBinder);
    public abstract boolean isTopActivityImmersive();
    public abstract boolean isTopOfTask(android.os.IBinder);
    public abstract boolean isUidActive(int, java.lang.String);
    public abstract boolean isUserAMonkey();
    public abstract boolean isUserRunning(int, int);
    public abstract boolean isVrModePackageEnabled(android.content.ComponentName);
    public abstract void keyguardGoingAway(int);
    public abstract void killAllBackgroundProcesses();
    public abstract void killApplication(java.lang.String, int, int, java.lang.String);
    public abstract void killApplicationProcess(java.lang.String, int);
    public abstract void killBackgroundProcesses(java.lang.String, int);
    public abstract void killPackageDependents(java.lang.String, int);
    public abstract boolean killPids(int[], java.lang.String, boolean);
    public abstract boolean killProcessesBelowForeground(java.lang.String);
    public abstract void killUid(int, int, java.lang.String);
    public abstract boolean launchAssistIntent(android.content.Intent, int, java.lang.String, int, android.os.Bundle);
    public abstract void makePackageIdle(java.lang.String, int);
    public abstract boolean moveActivityTaskToBack(android.os.IBinder, boolean);
    public abstract void moveStackToDisplay(int, int);
    public abstract void moveTaskBackwards(int);
    public abstract void moveTaskToFront(int, int, android.os.Bundle);
    public abstract void moveTaskToStack(int, int, boolean);
    public abstract void moveTasksToFullscreenStack(int, boolean);
    public abstract boolean moveTopActivityToPinnedStack(int, android.graphics.Rect);
    public abstract boolean navigateUpTo(android.os.IBinder, android.content.Intent, int, android.content.Intent);
    public abstract android.os.IBinder newUriPermissionOwner(java.lang.String);
    public abstract void noteAlarmFinish(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String);
    public abstract void noteAlarmStart(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String);
    public abstract void noteWakeupAlarm(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String, java.lang.String);
    public abstract void notifyActivityDrawn(android.os.IBinder);
    public abstract void notifyCleartextNetwork(int, byte[]);
    public abstract void notifyEnterAnimationComplete(android.os.IBinder);
    public abstract void notifyLaunchTaskBehindComplete(android.os.IBinder);
    public abstract void notifyLockedProfile(int);
    public abstract void notifyPinnedStackAnimationEnded();
    public abstract void notifyPinnedStackAnimationStarted();
    public abstract android.os.ParcelFileDescriptor openContentUri(java.lang.String);
    public abstract void overridePendingTransition(android.os.IBinder, java.lang.String, int, int);
    public abstract android.os.IBinder peekService(android.content.Intent, java.lang.String, java.lang.String);
    public abstract void performIdleMaintenance();
    public abstract void positionTaskInStack(int, int, int);
    public abstract boolean profileControl(java.lang.String, int, boolean, android.app.ProfilerInfo, int);
    public abstract void publishContentProviders(android.app.IApplicationThread, java.util.List);
    public abstract void publishService(android.os.IBinder, android.content.Intent, android.os.IBinder);
    public abstract boolean refContentProvider(android.os.IBinder, int, int);
    public abstract void registerIntentSenderCancelListener(android.content.IIntentSender, com.android.internal.os.IResultReceiver);
    public abstract void registerProcessObserver(android.app.IProcessObserver);
    public abstract android.content.Intent registerReceiver(android.app.IApplicationThread, java.lang.String, android.content.IIntentReceiver, android.content.IntentFilter, java.lang.String, int, int);
    public abstract void registerRemoteAnimationForNextActivityStart(java.lang.String, android.view.RemoteAnimationAdapter);
    public abstract void registerRemoteAnimations(android.os.IBinder, android.view.RemoteAnimationDefinition);
    public abstract void registerTaskStackListener(android.app.ITaskStackListener);
    public abstract void registerUidObserver(android.app.IUidObserver, int, int, java.lang.String);
    public abstract void registerUserSwitchObserver(android.app.IUserSwitchObserver, java.lang.String);
    public abstract boolean releaseActivityInstance(android.os.IBinder);
    public abstract void releasePersistableUriPermission(android.net.Uri, int, java.lang.String, int);
    public abstract void releaseSomeActivities(android.app.IApplicationThread);
    public abstract void removeContentProvider(android.os.IBinder, boolean);
    public abstract void removeContentProviderExternal(java.lang.String, android.os.IBinder);
    public abstract void removeStack(int);
    public abstract void removeStacksInWindowingModes(int[]);
    public abstract void removeStacksWithActivityTypes(int[]);
    public abstract boolean removeTask(int);
    public abstract void reportActivityFullyDrawn(android.os.IBinder, boolean);
    public abstract void reportAssistContextExtras(android.os.IBinder, android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, android.net.Uri);
    public abstract void reportSizeConfigurations(android.os.IBinder, int[], int[], int[]);
    public abstract boolean requestAssistContextExtras(int, android.app.IAssistDataReceiver, android.os.Bundle, android.os.IBinder, boolean, boolean);
    public abstract boolean requestAutofillData(android.app.IAssistDataReceiver, android.os.Bundle, android.os.IBinder, int);
    public abstract void requestBugReport(int);
    public abstract void requestTelephonyBugReport(java.lang.String, java.lang.String);
    public abstract void requestWifiBugReport(java.lang.String, java.lang.String);
    public abstract void resizeDockedStack(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect);
    public abstract void resizePinnedStack(android.graphics.Rect, android.graphics.Rect);
    public abstract void resizeStack(int, android.graphics.Rect, boolean, boolean, boolean, int);
    public abstract void resizeTask(int, android.graphics.Rect, int);
    public abstract void restart();
    public abstract int restartUserInBackground(int);
    public abstract void resumeAppSwitches();
    public abstract void revokeUriPermission(android.app.IApplicationThread, java.lang.String, android.net.Uri, int, int);
    public abstract void revokeUriPermissionFromOwner(android.os.IBinder, android.net.Uri, int, int);
    public abstract void scheduleApplicationInfoChanged(java.util.List, int);
    public abstract void sendIdleJobTrigger();
    public abstract int sendIntentSender(android.content.IIntentSender, android.os.IBinder, int, android.content.Intent, java.lang.String, android.content.IIntentReceiver, java.lang.String, android.os.Bundle);
    public abstract void serviceDoneExecuting(android.os.IBinder, int, int, int);
    public abstract void setActivityController(android.app.IActivityController, boolean);
    public abstract void setAgentApp(java.lang.String, java.lang.String);
    public abstract void setAlwaysFinish(boolean);
    public abstract void setDebugApp(java.lang.String, boolean, boolean);
    public abstract void setDisablePreviewScreenshots(android.os.IBinder, boolean);
    public abstract void setDumpHeapDebugLimit(java.lang.String, int, long, java.lang.String);
    public abstract void setFocusedStack(int);
    public abstract void setFocusedTask(int);
    public abstract void setFrontActivityScreenCompatMode(int);
    public abstract void setHasTopUi(boolean);
    public abstract void setImmersive(android.os.IBinder, boolean);
    public abstract void setLockScreenShown(boolean, boolean, int);
    public abstract void setPackageAskScreenCompat(java.lang.String, boolean);
    public abstract void setPackageScreenCompatMode(java.lang.String, int);
    public abstract void setPersistentVrThread(int);
    public abstract void setPictureInPictureParams(android.os.IBinder, android.app.PictureInPictureParams);
    public abstract void setProcessImportant(android.os.IBinder, int, boolean, java.lang.String);
    public abstract void setProcessLimit(int);
    public abstract boolean setProcessMemoryTrimLevel(java.lang.String, int, int);
    public abstract void setRenderThread(int);
    public abstract void setRequestedOrientation(android.os.IBinder, int);
    public abstract void setServiceForeground(android.content.ComponentName, android.os.IBinder, int, android.app.Notification, int);
    public abstract void setShowWhenLocked(android.os.IBinder, boolean);
    public abstract void setSplitScreenResizing(boolean);
    public abstract void setTaskDescription(android.os.IBinder, android.app.ActivityManager$TaskDescription);
    public abstract void setTaskResizeable(int, int);
    public abstract void setTaskWindowingMode(int, int, boolean);
    public abstract boolean setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean);
    public abstract void setTurnScreenOn(android.os.IBinder, boolean);
    public abstract void setUserIsMonkey(boolean);
    public abstract void setVoiceKeepAwake(android.service.voice.IVoiceInteractionSession, boolean);
    public abstract int setVrMode(android.os.IBinder, boolean, android.content.ComponentName);
    public abstract void setVrThread(int);
    public abstract boolean shouldUpRecreateTask(android.os.IBinder, java.lang.String);
    public abstract boolean showAssistFromActivity(android.os.IBinder, android.os.Bundle);
    public abstract void showBootMessage(java.lang.CharSequence, boolean);
    public abstract void showLockTaskEscapeMessage(android.os.IBinder);
    public abstract void showWaitingForDebugger(android.app.IApplicationThread, boolean);
    public abstract boolean shutdown(int);
    public abstract void signalPersistentProcesses(int);
    public abstract int startActivities(android.app.IApplicationThread, java.lang.String, android.content.Intent[], java.lang.String[], android.os.IBinder, android.os.Bundle, int);
    public abstract int startActivity(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle);
    public abstract android.app.WaitResult startActivityAndWait(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, int);
    public abstract int startActivityAsCaller(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, boolean, int);
    public abstract int startActivityAsUser(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, int);
    public abstract int startActivityFromRecents(int, android.os.Bundle);
    public abstract int startActivityIntentSender(android.app.IApplicationThread, android.content.IIntentSender, android.os.IBinder, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
    public abstract int startActivityWithConfig(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.content.res.Configuration, android.os.Bundle, int);
    public abstract int startAssistantActivity(java.lang.String, int, int, android.content.Intent, java.lang.String, android.os.Bundle, int);
    public abstract boolean startBinderTracking();
    public abstract void startConfirmDeviceCredentialIntent(android.content.Intent, android.os.Bundle);
    public abstract void startInPlaceAnimationOnFrontMostApplication(android.os.Bundle);
    public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, int, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, java.lang.String);
    public abstract void startLocalVoiceInteraction(android.os.IBinder, android.os.Bundle);
    public abstract void startLockTaskModeByToken(android.os.IBinder);
    public abstract boolean startNextMatchingActivity(android.os.IBinder, android.content.Intent, android.os.Bundle);
    public abstract void startRecentsActivity(android.content.Intent, android.app.IAssistDataReceiver, android.view.IRecentsAnimationRunner);
    public abstract android.content.ComponentName startService(android.app.IApplicationThread, android.content.Intent, java.lang.String, boolean, java.lang.String, int);
    public abstract void startSystemLockTaskMode(int);
    public abstract boolean startUserInBackground(int);
    public abstract boolean startUserInBackgroundWithListener(int, android.os.IProgressListener);
    public abstract int startVoiceActivity(java.lang.String, int, int, android.content.Intent, java.lang.String, android.service.voice.IVoiceInteractionSession, com.android.internal.app.IVoiceInteractor, int, android.app.ProfilerInfo, android.os.Bundle, int);
    public abstract void stopAppSwitches();
    public abstract boolean stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
    public abstract void stopLocalVoiceInteraction(android.os.IBinder);
    public abstract void stopLockTaskModeByToken(android.os.IBinder);
    public abstract int stopService(android.app.IApplicationThread, android.content.Intent, java.lang.String, int);
    public abstract boolean stopServiceToken(android.content.ComponentName, android.os.IBinder, int);
    public abstract void stopSystemLockTaskMode();
    public abstract int stopUser(int, boolean, android.app.IStopUserCallback);
    public abstract boolean supportsLocalVoiceInteraction();
    public abstract void suppressResizeConfigChanges(boolean);
    public abstract boolean switchUser(int);
    public abstract void takePersistableUriPermission(android.net.Uri, int, java.lang.String, int);
    public abstract void unbindBackupAgent(android.content.pm.ApplicationInfo);
    public abstract void unbindFinished(android.os.IBinder, android.content.Intent, boolean);
    public abstract boolean unbindService(android.app.IServiceConnection);
    public abstract void unbroadcastIntent(android.app.IApplicationThread, android.content.Intent, int);
    public abstract void unhandledBack();
    public abstract boolean unlockUser(int, byte[], byte[], android.os.IProgressListener);
    public abstract void unregisterIntentSenderCancelListener(android.content.IIntentSender, com.android.internal.os.IResultReceiver);
    public abstract void unregisterProcessObserver(android.app.IProcessObserver);
    public abstract void unregisterReceiver(android.content.IIntentReceiver);
    public abstract void unregisterTaskStackListener(android.app.ITaskStackListener);
    public abstract void unregisterUidObserver(android.app.IUidObserver);
    public abstract void unregisterUserSwitchObserver(android.app.IUserSwitchObserver);
    public abstract void unstableProviderDied(android.os.IBinder);
    public abstract boolean updateConfiguration(android.content.res.Configuration);
    public abstract void updateDeviceOwner(java.lang.String);
    public abstract boolean updateDisplayOverrideConfiguration(android.content.res.Configuration, int);
    public abstract void updateLockTaskFeatures(int, int);
    public abstract void updateLockTaskPackages(int, java.lang.String[]);
    public abstract void updatePersistentConfiguration(android.content.res.Configuration);
    public abstract void waitForNetworkStateUpdate(long);
    public abstract boolean willActivityBeVisible(android.os.IBinder);


}

-keep class android.app.IAppTask {

    public abstract void finishAndRemoveTask();
    public abstract android.app.ActivityManager$RecentTaskInfo getTaskInfo();
    public abstract void moveToFront();
    public abstract void setExcludeFromRecents(boolean);
    public abstract int startActivity(android.os.IBinder, java.lang.String, android.content.Intent, java.lang.String, android.os.Bundle);


}

-keep class android.app.IApplicationThread {

    public abstract void attachAgent(java.lang.String);
    public abstract void bindApplication(java.lang.String, android.content.pm.ApplicationInfo, java.util.List, android.content.ComponentName, android.app.ProfilerInfo, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, boolean, boolean, boolean, boolean, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.util.Map, android.os.Bundle, java.lang.String, boolean);
    public abstract void clearDnsCache();
    public abstract void dispatchPackageBroadcast(int, java.lang.String[]);
    public abstract void dumpActivity(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String, java.lang.String[]);
    public abstract void dumpDbInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public abstract void dumpGfxInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
    public abstract void dumpHeap(boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
    public abstract void dumpMemInfo(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, boolean, java.lang.String[]);
    public abstract void dumpMemInfoProto(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, java.lang.String[]);
    public abstract void dumpProvider(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public abstract void dumpService(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
    public abstract void handleTrustStorageUpdate();
    public abstract void notifyCleartextNetwork(byte[]);
    public abstract void processInBackground();
    public abstract void profilerControl(boolean, android.app.ProfilerInfo, int);
    public abstract void requestAssistContextExtras(android.os.IBinder, android.os.IBinder, int, int, int);
    public abstract void runIsolatedEntryPoint(java.lang.String, java.lang.String[]);
    public abstract void scheduleApplicationInfoChanged(android.content.pm.ApplicationInfo);
    public abstract void scheduleBindService(android.os.IBinder, android.content.Intent, boolean, int);
    public abstract void scheduleCrash(java.lang.String);
    public abstract void scheduleCreateBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
    public abstract void scheduleCreateService(android.os.IBinder, android.content.pm.ServiceInfo, android.content.res.CompatibilityInfo, int);
    public abstract void scheduleDestroyBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
    public abstract void scheduleEnterAnimationComplete(android.os.IBinder);
    public abstract void scheduleExit();
    public abstract void scheduleInstallProvider(android.content.pm.ProviderInfo);
    public abstract void scheduleLocalVoiceInteractionStarted(android.os.IBinder, com.android.internal.app.IVoiceInteractor);
    public abstract void scheduleLowMemory();
    public abstract void scheduleOnNewActivityOptions(android.os.IBinder, android.os.Bundle);
    public abstract void scheduleReceiver(android.content.Intent, android.content.pm.ActivityInfo, android.content.res.CompatibilityInfo, int, java.lang.String, android.os.Bundle, boolean, int, int);
    public abstract void scheduleRegisteredReceiver(android.content.IIntentReceiver, android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int, int);
    public abstract void scheduleServiceArgs(android.os.IBinder, android.content.pm.ParceledListSlice);
    public abstract void scheduleSleeping(android.os.IBinder, boolean);
    public abstract void scheduleStopService(android.os.IBinder);
    public abstract void scheduleSuicide();
    public abstract void scheduleTransaction(android.app.servertransaction.ClientTransaction);
    public abstract void scheduleTranslucentConversionComplete(android.os.IBinder, boolean);
    public abstract void scheduleTrimMemory(int);
    public abstract void scheduleUnbindService(android.os.IBinder, android.content.Intent);
    public abstract void setCoreSettings(android.os.Bundle);
    public abstract void setHttpProxy(java.lang.String, java.lang.String, java.lang.String, android.net.Uri);
    public abstract void setNetworkBlockSeq(long);
    public abstract void setProcessState(int);
    public abstract void setSchedulingGroup(int);
    public abstract void startBinderTracking();
    public abstract void stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
    public abstract void unstableProviderDied(android.os.IBinder);
    public abstract void updatePackageCompatibilityInfo(java.lang.String, android.content.res.CompatibilityInfo);
    public abstract void updateTimePrefs(int);
    public abstract void updateTimeZone();


}

-keep class android.app.IApplicationThread$Stub {
    <init>();

    public android.os.IBinder asBinder();
    public static android.app.IApplicationThread asInterface(android.os.IBinder);
    public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);


}

-keep class android.app.IAssistDataReceiver {

    public abstract void onHandleAssistData(android.os.Bundle);
    public abstract void onHandleAssistScreenshot(android.graphics.Bitmap);


}

-keep class android.app.IInstrumentationWatcher {

    public abstract void instrumentationFinished(android.content.ComponentName, int, android.os.Bundle);
    public abstract void instrumentationStatus(android.content.ComponentName, int, android.os.Bundle);


}

-keep class android.app.IProcessObserver {

    public abstract void onForegroundActivitiesChanged(int, int, boolean);
    public abstract void onProcessDied(int, int);


}

-keep class android.app.IServiceConnection {

    public abstract void connected(android.content.ComponentName, android.os.IBinder, boolean);


}

-keep class android.app.IStopUserCallback {

    public abstract void userStopAborted(int);
    public abstract void userStopped(int);


}

-keep class android.app.ITaskStackListener {

    public abstract void onActivityDismissingDockedStack();
    public abstract void onActivityForcedResizable(java.lang.String, int, int);
    public abstract void onActivityLaunchOnSecondaryDisplayFailed();
    public abstract void onActivityPinned(java.lang.String, int, int, int);
    public abstract void onActivityRequestedOrientationChanged(int, int);
    public abstract void onActivityUnpinned();
    public abstract void onPinnedActivityRestartAttempt(boolean);
    public abstract void onPinnedStackAnimationEnded();
    public abstract void onPinnedStackAnimationStarted();
    public abstract void onTaskCreated(int, android.content.ComponentName);
    public abstract void onTaskDescriptionChanged(int, android.app.ActivityManager$TaskDescription);
    public abstract void onTaskMovedToFront(int);
    public abstract void onTaskProfileLocked(int, int);
    public abstract void onTaskRemovalStarted(int);
    public abstract void onTaskRemoved(int);
    public abstract void onTaskSnapshotChanged(int, android.app.ActivityManager$TaskSnapshot);
    public abstract void onTaskStackChanged();


    public static int FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY;
    public static int FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
}

-keep class android.app.IUiAutomationConnection {

    public abstract void clearWindowAnimationFrameStats();
    public abstract boolean clearWindowContentFrameStats(int);
    public abstract void connect(android.accessibilityservice.IAccessibilityServiceClient, int);
    public abstract void disconnect();
    public abstract void executeShellCommand(java.lang.String, android.os.ParcelFileDescriptor, android.os.ParcelFileDescriptor);
    public abstract android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
    public abstract android.view.WindowContentFrameStats getWindowContentFrameStats(int);
    public abstract void grantRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean injectInputEvent(android.view.InputEvent, boolean);
    public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean setRotation(int);
    public abstract void shutdown();
    public abstract android.graphics.Bitmap takeScreenshot(android.graphics.Rect, int);


}

-keep class android.app.IUidObserver {

    public abstract void onUidActive(int);
    public abstract void onUidCachedChanged(int, boolean);
    public abstract void onUidGone(int, boolean);
    public abstract void onUidIdle(int, boolean);
    public abstract void onUidStateChanged(int, int, long);


}

-keep class android.app.IUserSwitchObserver {

    public abstract void onForegroundProfileSwitch(int);
    public abstract void onLockedBootComplete(int);
    public abstract void onUserSwitchComplete(int);
    public abstract void onUserSwitching(int, android.os.IRemoteCallback);


}

-keep class android.app.Instrumentation {
    <init>();

    public android.os.TestLooperManager acquireLooperManager(android.os.Looper);
    public void addMonitor(android.app.Instrumentation$ActivityMonitor);
    public android.app.Instrumentation$ActivityMonitor addMonitor(android.content.IntentFilter, android.app.Instrumentation$ActivityResult, boolean);
    public android.app.Instrumentation$ActivityMonitor addMonitor(java.lang.String, android.app.Instrumentation$ActivityResult, boolean);
    public void addResults(android.os.Bundle);
    public void callActivityOnCreate(android.app.Activity, android.os.Bundle);
    public void callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnDestroy(android.app.Activity);
    public void callActivityOnNewIntent(android.app.Activity, android.content.Intent);
    public void callActivityOnNewIntent(android.app.Activity, com.android.internal.content.ReferrerIntent);
    public void callActivityOnPause(android.app.Activity);
    public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle);
    public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnRestart(android.app.Activity);
    public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle);
    public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnResume(android.app.Activity);
    public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle);
    public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
    public void callActivityOnStart(android.app.Activity);
    public void callActivityOnStop(android.app.Activity);
    public void callActivityOnUserLeaving(android.app.Activity);
    public void callApplicationOnCreate(android.app.Application);
    public boolean checkMonitorHit(android.app.Instrumentation$ActivityMonitor, int);
    public static void checkStartActivityResult(int, java.lang.Object);
    public void endPerformanceSnapshot();
    public void execStartActivities(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent[], android.os.Bundle);
    public int execStartActivitiesAsUser(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent[], android.os.Bundle, int);
    public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent, int, android.os.Bundle);
    public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, java.lang.String, android.content.Intent, int, android.os.Bundle);
    public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, java.lang.String, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public android.app.Instrumentation$ActivityResult execStartActivityAsCaller(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent, int, android.os.Bundle, boolean, int);
    public void execStartActivityFromAppTask(android.content.Context, android.os.IBinder, android.app.IAppTask, android.content.Intent, android.os.Bundle);
    public void finish(int, android.os.Bundle);
    public android.os.Bundle getAllocCounts();
    public android.os.Bundle getBinderCounts();
    public android.content.ComponentName getComponentName();
    public android.content.Context getContext();
    public java.lang.String getProcessName();
    public android.content.Context getTargetContext();
    public android.app.UiAutomation getUiAutomation();
    public android.app.UiAutomation getUiAutomation(int);
    public boolean invokeContextMenuAction(android.app.Activity, int, int);
    public boolean invokeMenuActionSync(android.app.Activity, int, int);
    public boolean isProfiling();
    public android.app.Activity newActivity(java.lang.Class, android.content.Context, android.os.IBinder, android.app.Application, android.content.Intent, android.content.pm.ActivityInfo, java.lang.CharSequence, android.app.Activity, java.lang.String, java.lang.Object);
    public android.app.Activity newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
    public android.app.Application newApplication(java.lang.ClassLoader, java.lang.String, android.content.Context);
    public static android.app.Application newApplication(java.lang.Class, android.content.Context);
    public void onCreate(android.os.Bundle);
    public void onDestroy();
    public boolean onException(java.lang.Object, java.lang.Throwable);
    public void onStart();
    public void removeMonitor(android.app.Instrumentation$ActivityMonitor);
    public void runOnMainSync(java.lang.Runnable);
    public void sendCharacterSync(int);
    public void sendKeyDownUpSync(int);
    public void sendKeySync(android.view.KeyEvent);
    public void sendPointerSync(android.view.MotionEvent);
    public void sendStatus(int, android.os.Bundle);
    public void sendStringSync(java.lang.String);
    public void sendTrackballEventSync(android.view.MotionEvent);
    public void setAutomaticPerformanceSnapshots();
    public void setInTouchMode(boolean);
    public void start();
    public android.app.Activity startActivitySync(android.content.Intent);
    public android.app.Activity startActivitySync(android.content.Intent, android.os.Bundle);
    public void startAllocCounting();
    public void startPerformanceSnapshot();
    public void startProfiling();
    public void stopAllocCounting();
    public void stopProfiling();
    public void waitForIdle(java.lang.Runnable);
    public void waitForIdleSync();
    public android.app.Activity waitForMonitor(android.app.Instrumentation$ActivityMonitor);
    public android.app.Activity waitForMonitorWithTimeout(android.app.Instrumentation$ActivityMonitor, long);


    public static java.lang.String REPORT_KEY_IDENTIFIER;
    public static java.lang.String REPORT_KEY_STREAMRESULT;
}

-keep class android.app.Instrumentation$ActivityMonitor {
    <init>(android.content.IntentFilter, android.app.Instrumentation$ActivityResult, boolean);
    <init>(java.lang.String, android.app.Instrumentation$ActivityResult, boolean);
    <init>();

    public android.content.IntentFilter getFilter();
    public int getHits();
    public android.app.Activity getLastActivity();
    public android.app.Instrumentation$ActivityResult getResult();
    public boolean isBlocking();
    public android.app.Instrumentation$ActivityResult onStartActivity(android.content.Intent);
    public android.app.Activity waitForActivity();
    public android.app.Activity waitForActivityWithTimeout(long);


}

-keep class android.app.Instrumentation$ActivityResult {
    <init>(int, android.content.Intent);

    public int getResultCode();
    public android.content.Intent getResultData();


}

-keep class android.app.LoadedApk {
    <init>(android.app.ActivityThread, android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, java.lang.ClassLoader, boolean, boolean, boolean);

    public android.content.IIntentReceiver forgetReceiverDispatcher(android.content.Context, android.content.BroadcastReceiver);
    public android.app.IServiceConnection forgetServiceDispatcher(android.content.Context, android.content.ServiceConnection);
    public java.lang.String getAppDir();
    public android.app.AppComponentFactory getAppFactory();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public android.content.res.AssetManager getAssets();
    public java.lang.ClassLoader getClassLoader();
    public android.content.res.CompatibilityInfo getCompatibilityInfo();
    public java.io.File getCredentialProtectedDataDirFile();
    public java.lang.String getDataDir();
    public java.io.File getDataDirFile();
    public java.io.File getDeviceProtectedDataDirFile();
    public java.lang.String getLibDir();
    public java.lang.String[] getOverlayDirs();
    public java.lang.String getPackageName();
    public android.content.IIntentReceiver getReceiverDispatcher(android.content.BroadcastReceiver, android.content.Context, android.os.Handler, android.app.Instrumentation, boolean);
    public java.lang.String getResDir();
    public android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.content.Context, android.os.Handler, int);
    public java.lang.String[] getSplitAppDirs();
    public java.lang.String[] getSplitResDirs();
    public int getTargetSdkVersion();
    public boolean isSecurityViolation();
    public android.app.Application makeApplication(boolean, android.app.Instrumentation);
    public static void makePaths(android.app.ActivityThread, android.content.pm.ApplicationInfo, java.util.List);
    public static void makePaths(android.app.ActivityThread, boolean, android.content.pm.ApplicationInfo, java.util.List, java.util.List);
    public void removeContextRegistrations(android.content.Context, java.lang.String, java.lang.String);
    public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
    public void updateApplicationInfo(android.content.pm.ApplicationInfo, java.util.List);


}

-keep class android.app.LoaderManager {
    <init>();

    public abstract void destroyLoader(int);
    public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public static void enableDebugLogging(boolean);
    public android.app.FragmentHostCallback getFragmentHostCallback();
    public abstract android.content.Loader getLoader(int);
    public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager$LoaderCallbacks);
    public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager$LoaderCallbacks);


}

-keep class android.app.LoaderManager$LoaderCallbacks {

    public abstract android.content.Loader onCreateLoader(int, android.os.Bundle);
    public abstract void onLoadFinished(android.content.Loader, java.lang.Object);
    public abstract void onLoaderReset(android.content.Loader);


}

-keep class android.app.Notification {
    <init>();
    <init>(android.content.Context, int, java.lang.CharSequence, long, java.lang.CharSequence, java.lang.CharSequence, android.content.Intent);
    <init>(int, java.lang.CharSequence, long);
    <init>(android.os.Parcel);

    public static void addFieldsFromContext(android.content.Context, android.app.Notification);
    public static void addFieldsFromContext(android.content.pm.ApplicationInfo, android.app.Notification);
    public static boolean areActionsVisiblyDifferent(android.app.Notification, android.app.Notification);
    public static boolean areRemoteViewsChanged(android.app.Notification$Builder, android.app.Notification$Builder);
    public static boolean areStyledNotificationsVisiblyDifferent(android.app.Notification$Builder, android.app.Notification$Builder);
    public android.app.Notification clone();
    public java.lang.Object clone();
    public void cloneInto(android.app.Notification, boolean);
    public int describeContents();
    public int getBadgeIconType();
    public java.lang.String getChannel();
    public java.lang.String getChannelId();
    public java.lang.String getGroup();
    public int getGroupAlertBehavior();
    public android.graphics.drawable.Icon getLargeIcon();
    public java.lang.Class getNotificationStyle();
    public static java.lang.Class getNotificationStyleClass(java.lang.String);
    public java.lang.CharSequence getSettingsText();
    public java.lang.String getShortcutId();
    public android.graphics.drawable.Icon getSmallIcon();
    public java.lang.String getSortKey();
    public long getTimeout();
    public long getTimeoutAfter();
    public boolean hasCompletedProgress();
    public boolean hasMediaSession();
    public boolean isColorized();
    public boolean isColorizedMedia();
    public boolean isGroupChild();
    public boolean isGroupSummary();
    public boolean isMediaNotification();
    public void lightenPayload();
    public static java.lang.String priorityToString(int);
    public static java.lang.CharSequence safeCharSequence(java.lang.CharSequence);
    public void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
    public void setSmallIcon(android.graphics.drawable.Icon);
    public boolean showsChronometer();
    public boolean showsTime();
    public boolean suppressAlertingDueToGrouping();
    public java.lang.String toString();
    public static java.lang.String visibilityToString(int);
    public void visitUris(java.util.function.Consumer);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
    public static int BADGE_ICON_LARGE;
    public static int BADGE_ICON_NONE;
    public static int BADGE_ICON_SMALL;
    public static java.lang.String CATEGORY_ALARM;
    public static java.lang.String CATEGORY_CALL;
    public static java.lang.String CATEGORY_CAR_EMERGENCY;
    public static java.lang.String CATEGORY_CAR_INFORMATION;
    public static java.lang.String CATEGORY_CAR_WARNING;
    public static java.lang.String CATEGORY_EMAIL;
    public static java.lang.String CATEGORY_ERROR;
    public static java.lang.String CATEGORY_EVENT;
    public static java.lang.String CATEGORY_MESSAGE;
    public static java.lang.String CATEGORY_NAVIGATION;
    public static java.lang.String CATEGORY_PROGRESS;
    public static java.lang.String CATEGORY_PROMO;
    public static java.lang.String CATEGORY_RECOMMENDATION;
    public static java.lang.String CATEGORY_REMINDER;
    public static java.lang.String CATEGORY_SERVICE;
    public static java.lang.String CATEGORY_SOCIAL;
    public static java.lang.String CATEGORY_STATUS;
    public static java.lang.String CATEGORY_SYSTEM;
    public static java.lang.String CATEGORY_TRANSPORT;
    public static int COLOR_DEFAULT;
    public static int COLOR_INVALID;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DEFAULT_ALL;
    public static int DEFAULT_LIGHTS;
    public static int DEFAULT_SOUND;
    public static int DEFAULT_VIBRATE;
    public static java.lang.String EXTRA_ALLOW_DURING_SETUP;
    public static java.lang.String EXTRA_AUDIO_CONTENTS_URI;
    public static java.lang.String EXTRA_BACKGROUND_IMAGE_URI;
    public static java.lang.String EXTRA_BIG_TEXT;
    public static java.lang.String EXTRA_BUILDER_APPLICATION_INFO;
    public static java.lang.String EXTRA_CHANNEL_GROUP_ID;
    public static java.lang.String EXTRA_CHANNEL_ID;
    public static java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN;
    public static java.lang.String EXTRA_COLORIZED;
    public static java.lang.String EXTRA_COMPACT_ACTIONS;
    public static java.lang.String EXTRA_CONTAINS_CUSTOM_VIEW;
    public static java.lang.String EXTRA_CONVERSATION_TITLE;
    public static java.lang.String EXTRA_FOREGROUND_APPS;
    public static java.lang.String EXTRA_HIDE_SMART_REPLIES;
    public static java.lang.String EXTRA_HISTORIC_MESSAGES;
    public static java.lang.String EXTRA_INFO_TEXT;
    public static java.lang.String EXTRA_IS_GROUP_CONVERSATION;
    public static java.lang.String EXTRA_LARGE_ICON;
    public static java.lang.String EXTRA_LARGE_ICON_BIG;
    public static java.lang.String EXTRA_MEDIA_SESSION;
    public static java.lang.String EXTRA_MESSAGES;
    public static java.lang.String EXTRA_MESSAGING_PERSON;
    public static java.lang.String EXTRA_NOTIFICATION_ID;
    public static java.lang.String EXTRA_NOTIFICATION_TAG;
    public static java.lang.String EXTRA_PEOPLE;
    public static java.lang.String EXTRA_PEOPLE_LIST;
    public static java.lang.String EXTRA_PICTURE;
    public static java.lang.String EXTRA_PROGRESS;
    public static java.lang.String EXTRA_PROGRESS_INDETERMINATE;
    public static java.lang.String EXTRA_PROGRESS_MAX;
    public static java.lang.String EXTRA_REDUCED_IMAGES;
    public static java.lang.String EXTRA_REMOTE_INPUT_DRAFT;
    public static java.lang.String EXTRA_REMOTE_INPUT_HISTORY;
    public static java.lang.String EXTRA_SELF_DISPLAY_NAME;
    public static java.lang.String EXTRA_SHOW_CHRONOMETER;
    public static java.lang.String EXTRA_SHOW_REMOTE_INPUT_SPINNER;
    public static java.lang.String EXTRA_SHOW_WHEN;
    public static java.lang.String EXTRA_SMALL_ICON;
    public static java.lang.String EXTRA_SUBSTITUTE_APP_NAME;
    public static java.lang.String EXTRA_SUB_TEXT;
    public static java.lang.String EXTRA_SUMMARY_TEXT;
    public static java.lang.String EXTRA_TEMPLATE;
    public static java.lang.String EXTRA_TEXT;
    public static java.lang.String EXTRA_TEXT_LINES;
    public static java.lang.String EXTRA_TITLE;
    public static java.lang.String EXTRA_TITLE_BIG;
    public static int FLAG_AUTOGROUP_SUMMARY;
    public static int FLAG_AUTO_CANCEL;
    public static int FLAG_CAN_COLORIZE;
    public static int FLAG_FOREGROUND_SERVICE;
    public static int FLAG_GROUP_SUMMARY;
    public static int FLAG_HIGH_PRIORITY;
    public static int FLAG_INSISTENT;
    public static int FLAG_LOCAL_ONLY;
    public static int FLAG_NO_CLEAR;
    public static int FLAG_ONGOING_EVENT;
    public static int FLAG_ONLY_ALERT_ONCE;
    public static int FLAG_SHOW_LIGHTS;
    public static int GROUP_ALERT_ALL;
    public static int GROUP_ALERT_CHILDREN;
    public static int GROUP_ALERT_SUMMARY;
    public static java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES;
    public static int PRIORITY_DEFAULT;
    public static int PRIORITY_HIGH;
    public static int PRIORITY_LOW;
    public static int PRIORITY_MAX;
    public static int PRIORITY_MIN;
    public static int STREAM_DEFAULT;
    public static int VISIBILITY_PRIVATE;
    public static int VISIBILITY_PUBLIC;
    public static int VISIBILITY_SECRET;
    public android.app.Notification$Action[] actions;
    public android.util.ArraySet allPendingIntents;
    public android.media.AudioAttributes audioAttributes;
    public int audioStreamType;
    public android.widget.RemoteViews bigContentView;
    public java.lang.String category;
    public int color;
    public android.app.PendingIntent contentIntent;
    public android.widget.RemoteViews contentView;
    public int defaults;
    public android.app.PendingIntent deleteIntent;
    public android.os.Bundle extras;
    public int flags;
    public android.app.PendingIntent fullScreenIntent;
    public android.widget.RemoteViews headsUpContentView;
    public int icon;
    public int iconLevel;
    public android.graphics.Bitmap largeIcon;
    public int ledARGB;
    public int ledOffMS;
    public int ledOnMS;
    public int number;
    public int priority;
    public static android.os.IBinder processWhitelistToken;
    public android.app.Notification publicVersion;
    public android.net.Uri sound;
    public java.lang.CharSequence tickerText;
    public android.widget.RemoteViews tickerView;
    public long[] vibrate;
    public int visibility;
    public long when;
}

-keep class android.app.Notification$Action {
    <init>(int, java.lang.CharSequence, android.app.PendingIntent);

    public android.app.Notification$Action clone();
    public java.lang.Object clone();
    public int describeContents();
    public boolean getAllowGeneratedReplies();
    public android.app.RemoteInput[] getDataOnlyRemoteInputs();
    public android.os.Bundle getExtras();
    public android.graphics.drawable.Icon getIcon();
    public android.app.RemoteInput[] getRemoteInputs();
    public int getSemanticAction();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int SEMANTIC_ACTION_ARCHIVE;
    public static int SEMANTIC_ACTION_CALL;
    public static int SEMANTIC_ACTION_DELETE;
    public static int SEMANTIC_ACTION_MARK_AS_READ;
    public static int SEMANTIC_ACTION_MARK_AS_UNREAD;
    public static int SEMANTIC_ACTION_MUTE;
    public static int SEMANTIC_ACTION_NONE;
    public static int SEMANTIC_ACTION_REPLY;
    public static int SEMANTIC_ACTION_THUMBS_DOWN;
    public static int SEMANTIC_ACTION_THUMBS_UP;
    public static int SEMANTIC_ACTION_UNMUTE;
    public android.app.PendingIntent actionIntent;
    public int icon;
    public java.lang.CharSequence title;
}

-keep class android.app.Notification$Builder {
    <init>(android.content.Context, java.lang.String);
    <init>(android.content.Context);
    <init>(android.content.Context, android.app.Notification);

    public android.app.Notification$Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
    public android.app.Notification$Builder addAction(android.app.Notification$Action);
    public android.app.Notification$Builder addExtras(android.os.Bundle);
    public android.app.Notification$Builder addPerson(java.lang.String);
    public android.app.Notification$Builder addPerson(android.app.Person);
    public android.app.Notification build();
    public android.app.Notification buildInto(android.app.Notification);
    public android.app.Notification buildUnstyled();
    public android.widget.RemoteViews createBigContentView();
    public android.widget.RemoteViews createContentView();
    public android.widget.RemoteViews createContentView(boolean);
    public android.widget.RemoteViews createHeadsUpContentView(boolean);
    public android.widget.RemoteViews createHeadsUpContentView();
    public android.app.Notification$Builder extend(android.app.Notification$Extender);
    public android.os.Bundle getExtras();
    public java.lang.CharSequence getHeadsUpStatusBarText(boolean);
    public android.app.Notification getNotification();
    public int getPrimaryTextColor();
    public int getSecondaryTextColor();
    public android.app.Notification$Style getStyle();
    public java.lang.String loadHeaderAppName();
    public android.widget.RemoteViews makeAmbientNotification();
    public static void makeHeaderExpanded(android.widget.RemoteViews);
    public android.widget.RemoteViews makeLowPriorityContentView(boolean);
    public android.widget.RemoteViews makeNotificationHeader(boolean);
    public android.widget.RemoteViews makePublicAmbientNotification();
    public android.widget.RemoteViews makePublicContentView();
    public static android.app.Notification maybeCloneStrippedForDelivery(android.app.Notification, boolean, android.content.Context);
    public static android.app.Notification$Builder recoverBuilder(android.content.Context, android.app.Notification);
    public android.app.Notification$Builder setActions(android.app.Notification$Action[]);
    public android.app.Notification$Builder setAutoCancel(boolean);
    public android.app.Notification$Builder setBadgeIconType(int);
    public android.app.Notification$Builder setCategory(java.lang.String);
    public android.app.Notification$Builder setChannel(java.lang.String);
    public android.app.Notification$Builder setChannelId(java.lang.String);
    public android.app.Notification$Builder setChronometerCountDown(boolean);
    public android.app.Notification$Builder setColor(int);
    public void setColorPalette(int, int);
    public android.app.Notification$Builder setColorized(boolean);
    public android.app.Notification$Builder setContent(android.widget.RemoteViews);
    public android.app.Notification$Builder setContentInfo(java.lang.CharSequence);
    public android.app.Notification$Builder setContentIntent(android.app.PendingIntent);
    public android.app.Notification$Builder setContentText(java.lang.CharSequence);
    public android.app.Notification$Builder setContentTitle(java.lang.CharSequence);
    public android.app.Notification$Builder setCustomBigContentView(android.widget.RemoteViews);
    public android.app.Notification$Builder setCustomContentView(android.widget.RemoteViews);
    public android.app.Notification$Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
    public android.app.Notification$Builder setDefaults(int);
    public android.app.Notification$Builder setDeleteIntent(android.app.PendingIntent);
    public android.app.Notification$Builder setExtras(android.os.Bundle);
    public android.app.Notification$Builder setFlag(int, boolean);
    public android.app.Notification$Builder setFullScreenIntent(android.app.PendingIntent, boolean);
    public android.app.Notification$Builder setGroup(java.lang.String);
    public android.app.Notification$Builder setGroupAlertBehavior(int);
    public android.app.Notification$Builder setGroupSummary(boolean);
    public android.app.Notification$Builder setHideSmartReplies(boolean);
    public android.app.Notification$Builder setLargeIcon(android.graphics.Bitmap);
    public android.app.Notification$Builder setLargeIcon(android.graphics.drawable.Icon);
    public android.app.Notification$Builder setLights(int, int, int);
    public android.app.Notification$Builder setLocalOnly(boolean);
    public android.app.Notification$Builder setNumber(int);
    public android.app.Notification$Builder setOngoing(boolean);
    public android.app.Notification$Builder setOnlyAlertOnce(boolean);
    public android.app.Notification$Builder setPriority(int);
    public android.app.Notification$Builder setProgress(int, int, boolean);
    public android.app.Notification$Builder setPublicVersion(android.app.Notification);
    public void setRebuildStyledRemoteViews(boolean);
    public android.app.Notification$Builder setRemoteInputHistory(java.lang.CharSequence[]);
    public android.app.Notification$Builder setSettingsText(java.lang.CharSequence);
    public android.app.Notification$Builder setShortcutId(java.lang.String);
    public android.app.Notification$Builder setShowRemoteInputSpinner(boolean);
    public android.app.Notification$Builder setShowWhen(boolean);
    public android.app.Notification$Builder setSmallIcon(int);
    public android.app.Notification$Builder setSmallIcon(int, int);
    public android.app.Notification$Builder setSmallIcon(android.graphics.drawable.Icon);
    public android.app.Notification$Builder setSortKey(java.lang.String);
    public android.app.Notification$Builder setSound(android.net.Uri);
    public android.app.Notification$Builder setSound(android.net.Uri, int);
    public android.app.Notification$Builder setSound(android.net.Uri, android.media.AudioAttributes);
    public android.app.Notification$Builder setStyle(android.app.Notification$Style);
    public android.app.Notification$Builder setSubText(java.lang.CharSequence);
    public android.app.Notification$Builder setTicker(java.lang.CharSequence);
    public android.app.Notification$Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
    public android.app.Notification$Builder setTimeout(long);
    public android.app.Notification$Builder setTimeoutAfter(long);
    public android.app.Notification$Builder setUsesChronometer(boolean);
    public android.app.Notification$Builder setVibrate(long[]);
    public android.app.Notification$Builder setVisibility(int);
    public android.app.Notification$Builder setWhen(long);
    public boolean usesStandardHeader();


    public static java.lang.String EXTRA_REBUILD_BIG_CONTENT_VIEW_ACTION_COUNT;
    public static java.lang.String EXTRA_REBUILD_CONTENT_VIEW_ACTION_COUNT;
    public static java.lang.String EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT;
}

-keep class android.app.Notification$Extender {

    public abstract android.app.Notification$Builder extend(android.app.Notification$Builder);


}

-keep class android.app.Notification$Style {
    <init>();

    public void addExtras(android.os.Bundle);
    public abstract boolean areNotificationsVisiblyDifferent(android.app.Notification$Style);
    public android.app.Notification build();
    public android.app.Notification buildStyled(android.app.Notification);
    protected void checkBuilder();
    public boolean displayCustomViewInline();
    public java.lang.CharSequence getHeadsUpStatusBarText();
    protected android.widget.RemoteViews getStandardView(int);
    protected android.widget.RemoteViews getStandardView(int, android.app.Notification$TemplateBindResult);
    protected boolean hasProgress();
    public boolean hasSummaryInHeader();
    protected void internalSetBigContentTitle(java.lang.CharSequence);
    protected void internalSetSummaryText(java.lang.CharSequence);
    public android.widget.RemoteViews makeBigContentView();
    public android.widget.RemoteViews makeContentView(boolean);
    public android.widget.RemoteViews makeHeadsUpContentView(boolean);
    public void purgeResources();
    public void reduceImageSizes(android.content.Context);
    protected void restoreFromExtras(android.os.Bundle);
    public void setBuilder(android.app.Notification$Builder);
    public void validate(android.content.Context);


    protected android.app.Notification$Builder mBuilder;
    protected java.lang.CharSequence mSummaryText;
    protected boolean mSummaryTextSet;
}

-keep class android.app.Notification$TemplateBindResult {

    public int getIconMarginEnd();
    public void setIconMarginEnd(int);


}

-keep class android.app.OnActivityPausedListener {

    public abstract void onPaused(android.app.Activity);


}

-keep class android.app.PendingIntent {

    public void cancel();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int);
    public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle);
    public static android.app.PendingIntent getActivitiesAsUser(android.content.Context, int, android.content.Intent[], int, android.os.Bundle, android.os.UserHandle);
    public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
    public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle);
    public static android.app.PendingIntent getActivityAsUser(android.content.Context, int, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
    public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
    public static android.app.PendingIntent getBroadcastAsUser(android.content.Context, int, android.content.Intent, int, android.os.UserHandle);
    public java.lang.String getCreatorPackage();
    public int getCreatorUid();
    public android.os.UserHandle getCreatorUserHandle();
    public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int);
    public android.content.Intent getIntent();
    public android.content.IntentSender getIntentSender();
    public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
    public java.lang.String getTag(java.lang.String);
    public android.content.IIntentSender getTarget();
    public java.lang.String getTargetPackage();
    public android.os.IBinder getWhitelistToken();
    public int hashCode();
    public boolean isActivity();
    public boolean isForegroundService();
    public boolean isTargetedToPackage();
    public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
    public void registerCancelListener(android.app.PendingIntent$CancelListener);
    public void send();
    public void send(int);
    public void send(android.content.Context, int, android.content.Intent);
    public void send(int, android.app.PendingIntent$OnFinished, android.os.Handler);
    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler);
    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String);
    public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
    public int sendAndReturnResult(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
    public static void setOnMarshaledListener(android.app.PendingIntent$OnMarshaledListener);
    public java.lang.String toString();
    public void unregisterCancelListener(android.app.PendingIntent$CancelListener);
    public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_CANCEL_CURRENT;
    public static int FLAG_IMMUTABLE;
    public static int FLAG_NO_CREATE;
    public static int FLAG_ONE_SHOT;
    public static int FLAG_UPDATE_CURRENT;
}

-keep class android.app.PendingIntent$CancelListener {

    public abstract void onCancelled(android.app.PendingIntent);


}

-keep class android.app.PendingIntent$CanceledException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.Exception);



}

-keep class android.app.PendingIntent$OnFinished {

    public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);


}

-keep class android.app.PendingIntent$OnMarshaledListener {

    public abstract void onMarshaled(android.app.PendingIntent, android.os.Parcel, int);


}

-keep class android.app.Person {

    public int describeContents();
    public android.graphics.drawable.Icon getIcon();
    public java.lang.String getKey();
    public java.lang.CharSequence getName();
    public java.lang.String getUri();
    public boolean isBot();
    public boolean isImportant();
    public java.lang.String resolveToLegacyUri();
    public android.app.Person$Builder toBuilder();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.Person$Builder {
    <init>();

    public android.app.Person build();
    public android.app.Person$Builder setBot(boolean);
    public android.app.Person$Builder setIcon(android.graphics.drawable.Icon);
    public android.app.Person$Builder setImportant(boolean);
    public android.app.Person$Builder setKey(java.lang.String);
    public android.app.Person$Builder setName(java.lang.CharSequence);
    public android.app.Person$Builder setUri(java.lang.String);


}

-keep class android.app.PictureInPictureArgs {
    <init>();
    <init>(float, java.util.List);

    public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
    public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
    public void copyOnlySet(android.app.PictureInPictureArgs);
    public int describeContents();
    public java.util.List getActions();
    public float getAspectRatio();
    public android.util.Rational getAspectRatioRational();
    public android.graphics.Rect getSourceRectHint();
    public android.graphics.Rect getSourceRectHintInsets();
    public boolean hasSetActions();
    public boolean hasSetAspectRatio();
    public boolean hasSourceBoundsHint();
    public boolean hasSourceBoundsHintInsets();
    public void setActions(java.util.List);
    public void setAspectRatio(float);
    public void setSourceRectHint(android.graphics.Rect);
    public void setSourceRectHintInsets(android.graphics.Rect);
    public void truncateActions(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.PictureInPictureParams {

    public void copyOnlySet(android.app.PictureInPictureParams);
    public int describeContents();
    public java.util.List getActions();
    public float getAspectRatio();
    public android.util.Rational getAspectRatioRational();
    public android.graphics.Rect getSourceRectHint();
    public boolean hasSetActions();
    public boolean hasSetAspectRatio();
    public boolean hasSourceBoundsHint();
    public void truncateActions(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.ProfilerInfo {
    <init>(java.lang.String, android.os.ParcelFileDescriptor, int, boolean, boolean, java.lang.String, boolean);
    <init>(android.app.ProfilerInfo);

    public void closeFd();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public android.app.ProfilerInfo setAgent(java.lang.String, boolean);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String agent;
    public boolean attachAgentDuringBind;
    public boolean autoStopProfiler;
    public android.os.ParcelFileDescriptor profileFd;
    public java.lang.String profileFile;
    public int samplingInterval;
    public boolean streamingOutput;
}

-keep class android.app.RemoteAction {
    <init>(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);

    public android.app.RemoteAction clone();
    public java.lang.Object clone();
    public int describeContents();
    public void dump(java.lang.String, java.io.PrintWriter);
    public android.app.PendingIntent getActionIntent();
    public java.lang.CharSequence getContentDescription();
    public android.graphics.drawable.Icon getIcon();
    public java.lang.CharSequence getTitle();
    public boolean isEnabled();
    public void setEnabled(boolean);
    public void setShouldShowIcon(boolean);
    public boolean shouldShowIcon();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.RemoteInput {

    public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map);
    public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
    public int describeContents();
    public boolean getAllowFreeFormInput();
    public java.util.Set getAllowedDataTypes();
    public java.lang.CharSequence[] getChoices();
    public static java.util.Map getDataResultsFromIntent(android.content.Intent, java.lang.String);
    public android.os.Bundle getExtras();
    public java.lang.CharSequence getLabel();
    public java.lang.String getResultKey();
    public static android.os.Bundle getResultsFromIntent(android.content.Intent);
    public static int getResultsSource(android.content.Intent);
    public boolean isDataOnly();
    public static void setResultsSource(android.content.Intent, int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_RESULTS_DATA;
    public static java.lang.String RESULTS_CLIP_LABEL;
    public static int SOURCE_CHOICE;
    public static int SOURCE_FREE_FORM_INPUT;
}

-keep class android.app.ResultInfo {
    <init>(java.lang.String, int, int, android.content.Intent);
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.Intent mData;
    public int mRequestCode;
    public int mResultCode;
    public java.lang.String mResultWho;
}

-keep class android.app.Service {
    <init>();

    public void attach(android.content.Context, android.app.ActivityThread, java.lang.String, android.os.IBinder, android.app.Application, java.lang.Object);
    public void detachAndCleanUp();
    protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public android.app.Application getApplication();
    public abstract android.os.IBinder onBind(android.content.Intent);
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onCreate();
    public void onDestroy();
    public void onLowMemory();
    public void onRebind(android.content.Intent);
    public void onStart(android.content.Intent, int);
    public int onStartCommand(android.content.Intent, int, int);
    public void onTaskRemoved(android.content.Intent);
    public void onTrimMemory(int);
    public boolean onUnbind(android.content.Intent);
    public void setForeground(boolean);
    public void startForeground(int, android.app.Notification);
    public void stopForeground(boolean);
    public void stopForeground(int);
    public void stopSelf();
    public void stopSelf(int);
    public boolean stopSelfResult(int);


    public static int START_CONTINUATION_MASK;
    public static int START_FLAG_REDELIVERY;
    public static int START_FLAG_RETRY;
    public static int START_NOT_STICKY;
    public static int START_REDELIVER_INTENT;
    public static int START_STICKY;
    public static int START_STICKY_COMPATIBILITY;
    public static int START_TASK_REMOVED_COMPLETE;
    public static int STOP_FOREGROUND_DETACH;
    public static int STOP_FOREGROUND_REMOVE;
}

-keep class android.app.SharedElementCallback {
    <init>();

    public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
    public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
    public void onMapSharedElements(java.util.List, java.util.Map);
    public void onRejectSharedElements(java.util.List);
    public void onSharedElementEnd(java.util.List, java.util.List, java.util.List);
    public void onSharedElementStart(java.util.List, java.util.List, java.util.List);
    public void onSharedElementsArrived(java.util.List, java.util.List, android.app.SharedElementCallback$OnSharedElementsReadyListener);


}

-keep class android.app.SharedElementCallback$OnSharedElementsReadyListener {

    public abstract void onSharedElementsReady();


}

-keep class android.app.TaskStackBuilder {

    public android.app.TaskStackBuilder addNextIntent(android.content.Intent);
    public android.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
    public android.app.TaskStackBuilder addParentStack(android.app.Activity);
    public android.app.TaskStackBuilder addParentStack(java.lang.Class);
    public android.app.TaskStackBuilder addParentStack(android.content.ComponentName);
    public static android.app.TaskStackBuilder create(android.content.Context);
    public android.content.Intent editIntentAt(int);
    public int getIntentCount();
    public android.content.Intent[] getIntents();
    public android.app.PendingIntent getPendingIntent(int, int);
    public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
    public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle, android.os.UserHandle);
    public void startActivities();
    public int startActivities(android.os.Bundle, android.os.UserHandle);
    public void startActivities(android.os.Bundle);


}

-keep class android.app.UiAutomation {
    <init>(android.os.Looper, android.app.IUiAutomationConnection);

    public void clearWindowAnimationFrameStats();
    public boolean clearWindowContentFrameStats(int);
    public void connect();
    public void connect(int);
    public void destroy();
    public void disconnect();
    public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation$AccessibilityEventFilter, long);
    public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String);
    public android.os.ParcelFileDescriptor[] executeShellCommandRw(java.lang.String);
    public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    public int getConnectionId();
    public int getFlags();
    public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
    public android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
    public android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
    public android.view.WindowContentFrameStats getWindowContentFrameStats(int);
    public java.util.List getWindows();
    public void grantRuntimePermission(java.lang.String, java.lang.String);
    public boolean grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public void grantRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
    public boolean injectInputEvent(android.view.InputEvent, boolean);
    public boolean isDestroyed();
    public boolean performGlobalAction(int);
    public void revokeRuntimePermission(java.lang.String, java.lang.String);
    public boolean revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public void revokeRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
    public void setOnAccessibilityEventListener(android.app.UiAutomation$OnAccessibilityEventListener);
    public boolean setRotation(int);
    public void setRunAsMonkey(boolean);
    public void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
    public android.graphics.Bitmap takeScreenshot();
    public void waitForIdle(long, long);


    public static int FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES;
    public static int ROTATION_FREEZE_0;
    public static int ROTATION_FREEZE_180;
    public static int ROTATION_FREEZE_270;
    public static int ROTATION_FREEZE_90;
    public static int ROTATION_FREEZE_CURRENT;
    public static int ROTATION_UNFREEZE;
}

-keep class android.app.UiAutomation$AccessibilityEventFilter {

    public abstract boolean accept(android.view.accessibility.AccessibilityEvent);


}

-keep class android.app.UiAutomation$OnAccessibilityEventListener {

    public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);


}

-keep class android.app.VoiceInteractor {

    public android.app.VoiceInteractor$Request getActiveRequest(java.lang.String);
    public android.app.VoiceInteractor$Request[] getActiveRequests();
    public boolean submitRequest(android.app.VoiceInteractor$Request);
    public boolean submitRequest(android.app.VoiceInteractor$Request, java.lang.String);
    public boolean[] supportsCommands(java.lang.String[]);


}

-keep class android.app.VoiceInteractor$PickOptionRequest {
    <init>(android.app.VoiceInteractor$Prompt, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
    <init>(java.lang.CharSequence, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);

    public void onPickOptionResult(boolean, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);


}

-keep class android.app.VoiceInteractor$PickOptionRequest$Option {
    <init>(java.lang.CharSequence);
    <init>(java.lang.CharSequence, int);

    public android.app.VoiceInteractor$PickOptionRequest$Option addSynonym(java.lang.CharSequence);
    public int countSynonyms();
    public int describeContents();
    public android.os.Bundle getExtras();
    public int getIndex();
    public java.lang.CharSequence getLabel();
    public java.lang.CharSequence getSynonymAt(int);
    public void setExtras(android.os.Bundle);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.VoiceInteractor$Prompt {
    <init>(java.lang.CharSequence[], java.lang.CharSequence);
    <init>(java.lang.CharSequence);

    public int countVoicePrompts();
    public int describeContents();
    public java.lang.CharSequence getVisualPrompt();
    public java.lang.CharSequence getVoicePromptAt(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.VoiceInteractor$Request {

    public void cancel();
    public android.app.Activity getActivity();
    public android.content.Context getContext();
    public java.lang.String getName();
    public void onAttached(android.app.Activity);
    public void onCancel();
    public void onDetached();
    public java.lang.String toString();


}

-keep class android.app.WaitResult {
    <init>();

    public int describeContents();
    public void dump(java.io.PrintWriter, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int result;
    public long thisTime;
    public boolean timeout;
    public long totalTime;
    public android.content.ComponentName who;
}

-keep class android.app.WindowConfiguration {
    <init>();
    <init>(android.app.WindowConfiguration);

    public static java.lang.String activityTypeToString(int);
    public boolean canReceiveKeys();
    public boolean canResizeTask();
    public int compareTo(android.app.WindowConfiguration);
    public int compareTo(java.lang.Object);
    public int describeContents();
    public long diff(android.app.WindowConfiguration, boolean);
    public boolean equals(java.lang.Object);
    public int getActivityType();
    public android.graphics.Rect getAppBounds();
    public android.graphics.Rect getBounds();
    public int getWindowingMode();
    public boolean hasMovementAnimations();
    public boolean hasWindowDecorCaption();
    public boolean hasWindowShadow();
    public int hashCode();
    public boolean isAlwaysOnTop();
    public static boolean isFloating(int);
    public boolean keepVisibleDeadAppWindowOnScreen();
    public boolean persistTaskBounds();
    public void setActivityType(int);
    public void setAppBounds(android.graphics.Rect);
    public void setAppBounds(int, int, int, int);
    public void setBounds(android.graphics.Rect);
    public void setTo(android.app.WindowConfiguration);
    public void setToDefaults();
    public void setWindowingMode(int);
    public boolean supportSplitScreenWindowingMode();
    public static boolean supportSplitScreenWindowingMode(int);
    public boolean tasksAreFloating();
    public java.lang.String toString();
    public void unset();
    public int updateFrom(android.app.WindowConfiguration);
    public boolean useWindowFrameForBackdrop();
    public static java.lang.String windowingModeToString(int);
    public boolean windowsAreScaleable();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int ACTIVITY_TYPE_ASSISTANT;
    public static int ACTIVITY_TYPE_HOME;
    public static int ACTIVITY_TYPE_RECENTS;
    public static int ACTIVITY_TYPE_STANDARD;
    public static int ACTIVITY_TYPE_UNDEFINED;
    public static android.os.Parcelable$Creator CREATOR;
    public static int PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
    public static int WINDOWING_MODE_FREEFORM;
    public static int WINDOWING_MODE_FULLSCREEN;
    public static int WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
    public static int WINDOWING_MODE_PINNED;
    public static int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
    public static int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
    public static int WINDOWING_MODE_UNDEFINED;
    public static int WINDOW_CONFIG_ACTIVITY_TYPE;
    public static int WINDOW_CONFIG_APP_BOUNDS;
    public static int WINDOW_CONFIG_BOUNDS;
    public static int WINDOW_CONFIG_WINDOWING_MODE;
}

-keep class android.app.assist.AssistContent {
    <init>();

    public int describeContents();
    public android.content.ClipData getClipData();
    public android.os.Bundle getExtras();
    public android.content.Intent getIntent();
    public java.lang.String getStructuredData();
    public android.net.Uri getWebUri();
    public boolean isAppProvidedIntent();
    public boolean isAppProvidedWebUri();
    public void setClipData(android.content.ClipData);
    public void setDefaultIntent(android.content.Intent);
    public void setIntent(android.content.Intent);
    public void setStructuredData(java.lang.String);
    public void setWebUri(android.net.Uri);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.assist.AssistStructure {
    <init>(android.app.Activity, boolean, int);
    <init>();
    <init>(android.os.Parcel);

    public void clearSendChannel();
    public int describeContents();
    public void dump(boolean);
    public void ensureData();
    public void ensureDataForAutofill();
    public long getAcquisitionEndTime();
    public long getAcquisitionStartTime();
    public android.content.ComponentName getActivityComponent();
    public int getFlags();
    public android.app.assist.AssistStructure$WindowNode getWindowNodeAt(int);
    public int getWindowNodeCount();
    public boolean isHomeActivity();
    public void sanitizeForParceling(boolean);
    public void setAcquisitionEndTime(long);
    public void setAcquisitionStartTime(long);
    public void setActivityComponent(android.content.ComponentName);
    public void setHomeActivity(boolean);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.assist.AssistStructure$AutofillOverlay {
    <init>();



    public boolean focused;
    public android.view.autofill.AutofillValue value;
}

-keep class android.app.assist.AssistStructure$ViewNode {

    public float getAlpha();
    public java.lang.String[] getAutofillHints();
    public android.view.autofill.AutofillId getAutofillId();
    public java.lang.CharSequence[] getAutofillOptions();
    public int getAutofillType();
    public android.view.autofill.AutofillValue getAutofillValue();
    public android.app.assist.AssistStructure$ViewNode getChildAt(int);
    public int getChildCount();
    public java.lang.String getClassName();
    public java.lang.CharSequence getContentDescription();
    public float getElevation();
    public android.os.Bundle getExtras();
    public int getHeight();
    public java.lang.String getHint();
    public android.view.ViewStructure$HtmlInfo getHtmlInfo();
    public int getId();
    public java.lang.String getIdEntry();
    public java.lang.String getIdPackage();
    public java.lang.String getIdType();
    public int getImportantForAutofill();
    public int getInputType();
    public int getLeft();
    public android.os.LocaleList getLocaleList();
    public int getMaxTextEms();
    public int getMaxTextLength();
    public int getMinTextEms();
    public int getScrollX();
    public int getScrollY();
    public java.lang.CharSequence getText();
    public int getTextBackgroundColor();
    public int getTextColor();
    public java.lang.String getTextIdEntry();
    public int[] getTextLineBaselines();
    public int[] getTextLineCharOffsets();
    public int getTextSelectionEnd();
    public int getTextSelectionStart();
    public float getTextSize();
    public int getTextStyle();
    public int getTop();
    public android.graphics.Matrix getTransformation();
    public int getVisibility();
    public java.lang.String getWebDomain();
    public java.lang.String getWebScheme();
    public int getWidth();
    public boolean isAccessibilityFocused();
    public boolean isActivated();
    public boolean isAssistBlocked();
    public boolean isCheckable();
    public boolean isChecked();
    public boolean isClickable();
    public boolean isContextClickable();
    public boolean isEnabled();
    public boolean isFocusable();
    public boolean isFocused();
    public boolean isLongClickable();
    public boolean isOpaque();
    public boolean isSanitized();
    public boolean isSelected();
    public void setAutofillOverlay(android.app.assist.AssistStructure$AutofillOverlay);
    public void setWebDomain(java.lang.String);
    public void updateAutofillValue(android.view.autofill.AutofillValue);


    public static int TEXT_COLOR_UNDEFINED;
    public static int TEXT_STYLE_BOLD;
    public static int TEXT_STYLE_ITALIC;
    public static int TEXT_STYLE_STRIKE_THRU;
    public static int TEXT_STYLE_UNDERLINE;
}

-keep class android.app.assist.AssistStructure$WindowNode {

    public int getDisplayId();
    public int getHeight();
    public int getLeft();
    public android.app.assist.AssistStructure$ViewNode getRootViewNode();
    public java.lang.CharSequence getTitle();
    public int getTop();
    public int getWidth();


}

-keep class android.app.servertransaction.ActivityLifecycleItem {
    <init>();

    public abstract int getTargetState();
    public void recycle();


    public static int ON_CREATE;
    public static int ON_DESTROY;
    public static int ON_PAUSE;
    public static int ON_RESTART;
    public static int ON_RESUME;
    public static int ON_START;
    public static int ON_STOP;
    public static int PRE_ON_CREATE;
    public static int UNDEFINED;
}

-keep class android.app.servertransaction.ClientTransaction {

    public void addCallback(android.app.servertransaction.ClientTransactionItem);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.os.IBinder getActivityToken();
    public android.app.IApplicationThread getClient();
    public android.app.servertransaction.ActivityLifecycleItem getLifecycleStateRequest();
    public int hashCode();
    public static android.app.servertransaction.ClientTransaction obtain(android.app.IApplicationThread, android.os.IBinder);
    public void preExecute(android.app.ClientTransactionHandler);
    public void recycle();
    public void schedule();
    public void setLifecycleStateRequest(android.app.servertransaction.ActivityLifecycleItem);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.app.servertransaction.ClientTransactionItem {
    <init>();

    public int describeContents();
    public int getPostExecutionState();


}

-keep class android.app.servertransaction.PendingTransactionActions {
    <init>();

    public void clear();
    public android.os.Bundle getOldState();
    public android.app.servertransaction.PendingTransactionActions$StopInfo getStopInfo();
    public void setCallOnPostCreate(boolean);
    public void setOldState(android.os.Bundle);
    public void setReportRelaunchToWindowManager(boolean);
    public void setRestoreInstanceState(boolean);
    public void setStopInfo(android.app.servertransaction.PendingTransactionActions$StopInfo);
    public boolean shouldCallOnPostCreate();
    public boolean shouldReportRelaunchToWindowManager();
    public boolean shouldRestoreInstanceState();


}

-keep class android.app.servertransaction.PendingTransactionActions$StopInfo {
    <init>();

    public void run();
    public void setActivity(android.app.ActivityThread$ActivityClientRecord);
    public void setDescription(java.lang.CharSequence);
    public void setPersistentState(android.os.PersistableBundle);
    public void setState(android.os.Bundle);


}

-keep class android.content.BroadcastReceiver {
    <init>();

    public void abortBroadcast();
    public void clearAbortBroadcast();
    public boolean getAbortBroadcast();
    public boolean getDebugUnregister();
    public android.content.BroadcastReceiver$PendingResult getPendingResult();
    public int getResultCode();
    public java.lang.String getResultData();
    public android.os.Bundle getResultExtras(boolean);
    public int getSendingUserId();
    public android.content.BroadcastReceiver$PendingResult goAsync();
    public boolean isInitialStickyBroadcast();
    public boolean isOrderedBroadcast();
    public abstract void onReceive(android.content.Context, android.content.Intent);
    public android.os.IBinder peekService(android.content.Context, android.content.Intent);
    public void setDebugUnregister(boolean);
    public void setOrderedHint(boolean);
    public void setPendingResult(android.content.BroadcastReceiver$PendingResult);
    public void setResult(int, java.lang.String, android.os.Bundle);
    public void setResultCode(int);
    public void setResultData(java.lang.String);
    public void setResultExtras(android.os.Bundle);


}

-keep class android.content.BroadcastReceiver$PendingResult {
    <init>(int, java.lang.String, android.os.Bundle, int, boolean, boolean, android.os.IBinder, int, int);

    public void abortBroadcast();
    public void clearAbortBroadcast();
    public void finish();
    public boolean getAbortBroadcast();
    public int getResultCode();
    public java.lang.String getResultData();
    public android.os.Bundle getResultExtras(boolean);
    public int getSendingUserId();
    public void sendFinished(android.app.IActivityManager);
    public void setExtrasClassLoader(java.lang.ClassLoader);
    public void setResult(int, java.lang.String, android.os.Bundle);
    public void setResultCode(int);
    public void setResultData(java.lang.String);
    public void setResultExtras(android.os.Bundle);


    public static int TYPE_COMPONENT;
    public static int TYPE_REGISTERED;
    public static int TYPE_UNREGISTERED;
}

-keep class android.content.ClipData {
    <init>(java.lang.CharSequence, java.lang.String[], android.content.ClipData$Item);
    <init>(android.content.ClipDescription, android.content.ClipData$Item);
    <init>(android.content.ClipDescription, java.util.ArrayList);
    <init>(android.content.ClipData);

    public void addItem(android.content.ClipData$Item);
    public void addItem(android.content.ClipData$Item, android.content.ContentResolver);
    public void addItem(android.content.ContentResolver, android.content.ClipData$Item);
    public void collectUris(java.util.List);
    public int describeContents();
    public void fixUris(int);
    public void fixUrisLight(int);
    public android.content.ClipDescription getDescription();
    public android.graphics.Bitmap getIcon();
    public android.content.ClipData$Item getItemAt(int);
    public int getItemCount();
    public static android.content.ClipData newHtmlText(java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
    public static android.content.ClipData newIntent(java.lang.CharSequence, android.content.Intent);
    public static android.content.ClipData newPlainText(java.lang.CharSequence, java.lang.CharSequence);
    public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
    public static android.content.ClipData newUri(android.content.ContentResolver, java.lang.CharSequence, android.net.Uri);
    public void prepareToEnterProcess();
    public void prepareToLeaveProcess(boolean);
    public void prepareToLeaveProcess(boolean, int);
    public void setItemAt(int, android.content.ClipData$Item);
    public void toShortString(java.lang.StringBuilder);
    public void toShortStringShortItems(java.lang.StringBuilder, boolean);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ClipData$Item {
    <init>(android.content.ClipData$Item);
    <init>(java.lang.CharSequence);
    <init>(java.lang.CharSequence, java.lang.String);
    <init>(android.content.Intent);
    <init>(android.net.Uri);
    <init>(java.lang.CharSequence, android.content.Intent, android.net.Uri);
    <init>(java.lang.CharSequence, java.lang.String, android.content.Intent, android.net.Uri);

    public java.lang.String coerceToHtmlText(android.content.Context);
    public java.lang.CharSequence coerceToStyledText(android.content.Context);
    public java.lang.CharSequence coerceToText(android.content.Context);
    public java.lang.String getHtmlText();
    public android.content.Intent getIntent();
    public java.lang.CharSequence getText();
    public android.net.Uri getUri();
    public void toShortString(java.lang.StringBuilder);
    public void toShortSummaryString(java.lang.StringBuilder);
    public java.lang.String toString();
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


}

-keep class android.content.ClipDescription {
    <init>(java.lang.CharSequence, java.lang.String[]);
    <init>(android.content.ClipDescription);

    public static boolean compareMimeTypes(java.lang.String, java.lang.String);
    public int describeContents();
    public java.lang.String[] filterMimeTypes(java.lang.String);
    public android.os.PersistableBundle getExtras();
    public java.lang.CharSequence getLabel();
    public java.lang.String getMimeType(int);
    public int getMimeTypeCount();
    public long getTimestamp();
    public boolean hasMimeType(java.lang.String);
    public void setExtras(android.os.PersistableBundle);
    public void setTimestamp(long);
    public boolean toShortString(java.lang.StringBuilder);
    public boolean toShortStringTypesOnly(java.lang.StringBuilder);
    public java.lang.String toString();
    public void validate();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_TARGET_COMPONENT_NAME;
    public static java.lang.String EXTRA_USER_SERIAL_NUMBER;
    public static java.lang.String MIMETYPE_TEXT_HTML;
    public static java.lang.String MIMETYPE_TEXT_INTENT;
    public static java.lang.String MIMETYPE_TEXT_PLAIN;
    public static java.lang.String MIMETYPE_TEXT_URILIST;
}

-keep class android.content.ComponentCallbacks {

    public abstract void onConfigurationChanged(android.content.res.Configuration);
    public abstract void onLowMemory();


}

-keep class android.content.ComponentName {
    <init>(java.lang.String, java.lang.String);
    <init>(android.content.Context, java.lang.String);
    <init>(android.content.Context, java.lang.Class);
    <init>(android.os.Parcel);

    public void appendShortString(java.lang.StringBuilder);
    public static void appendShortString(java.lang.StringBuilder, java.lang.String, java.lang.String);
    public android.content.ComponentName clone();
    public java.lang.Object clone();
    public int compareTo(android.content.ComponentName);
    public int compareTo(java.lang.Object);
    public static android.content.ComponentName createRelative(java.lang.String, java.lang.String);
    public static android.content.ComponentName createRelative(android.content.Context, java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String flattenToShortString();
    public java.lang.String flattenToString();
    public java.lang.String getClassName();
    public java.lang.String getPackageName();
    public java.lang.String getShortClassName();
    public int hashCode();
    public static void printShortString(java.io.PrintWriter, java.lang.String, java.lang.String);
    public static android.content.ComponentName readFromParcel(android.os.Parcel);
    public java.lang.String toShortString();
    public java.lang.String toString();
    public static android.content.ComponentName unflattenFromString(java.lang.String);
    public void writeToParcel(android.os.Parcel, int);
    public static void writeToParcel(android.content.ComponentName, android.os.Parcel);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.ContentProvider {
    <init>();
    <init>(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);

    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
    public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
    public void attachInfoForTesting(android.content.Context, android.content.pm.ProviderInfo);
    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
    public android.net.Uri canonicalize(android.net.Uri);
    public static android.content.ContentProvider coerceToLocalContentProvider(android.content.IContentProvider);
    public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    protected int enforceReadPermissionInner(android.net.Uri, java.lang.String, android.os.IBinder);
    protected int enforceWritePermissionInner(android.net.Uri, java.lang.String, android.os.IBinder);
    public android.app.AppOpsManager getAppOpsManager();
    public static java.lang.String getAuthorityWithoutUserId(java.lang.String);
    public java.lang.String getCallingPackage();
    public android.content.Context getContext();
    public android.content.IContentProvider getIContentProvider();
    public android.content.pm.PathPermission[] getPathPermissions();
    public java.lang.String getReadPermission();
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public abstract java.lang.String getType(android.net.Uri);
    public static android.net.Uri getUriWithoutUserId(android.net.Uri);
    public static int getUserIdFromAuthority(java.lang.String, int);
    public static int getUserIdFromAuthority(java.lang.String);
    public static int getUserIdFromUri(android.net.Uri, int);
    public static int getUserIdFromUri(android.net.Uri);
    public java.lang.String getWritePermission();
    public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    protected boolean isTemporary();
    protected boolean matchesOurAuthorities(java.lang.String);
    public static android.net.Uri maybeAddUserId(android.net.Uri, int);
    public void onConfigurationChanged(android.content.res.Configuration);
    public abstract boolean onCreate();
    public void onLowMemory();
    public void onTrimMemory(int);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    protected android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object, android.content.ContentProvider$PipeDataWriter);
    public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
    public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
    public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    public android.net.Uri rejectInsert(android.net.Uri, android.content.ContentValues);
    public void setAppOps(int, int);
    protected void setAuthorities(java.lang.String);
    protected void setPathPermissions(android.content.pm.PathPermission[]);
    protected void setReadPermission(java.lang.String);
    protected void setWritePermission(java.lang.String);
    public void shutdown();
    public android.net.Uri uncanonicalize(android.net.Uri);
    public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
    public static boolean uriHasUserId(android.net.Uri);


}

-keep class android.content.ContentProvider$PipeDataWriter {

    public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object);


}

-keep class android.content.ContentProviderClient {
    <init>(android.content.ContentResolver, android.content.IContentProvider, boolean);

    public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
    public android.net.Uri canonicalize(android.net.Uri);
    public void close();
    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    protected void finalize();
    public android.content.ContentProvider getLocalContentProvider();
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public java.lang.String getType(android.net.Uri);
    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    public boolean release();
    public static void releaseQuietly(android.content.ContentProviderClient);
    public void setDetectNotResponding(long);
    public android.net.Uri uncanonicalize(android.net.Uri);
    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);


}

-keep class android.content.ContentProviderOperation {
    <init>(android.content.ContentProviderOperation, boolean);

    public android.content.ContentProviderResult apply(android.content.ContentProvider, android.content.ContentProviderResult[], int);
    public int describeContents();
    public int getType();
    public android.net.Uri getUri();
    public android.content.ContentProviderOperation getWithoutUserIdInUri();
    public boolean isAssertQuery();
    public boolean isDelete();
    public boolean isInsert();
    public boolean isReadOperation();
    public boolean isUpdate();
    public boolean isWriteOperation();
    public boolean isYieldAllowed();
    public static android.content.ContentProviderOperation$Builder newAssertQuery(android.net.Uri);
    public static android.content.ContentProviderOperation$Builder newDelete(android.net.Uri);
    public static android.content.ContentProviderOperation$Builder newInsert(android.net.Uri);
    public static android.content.ContentProviderOperation$Builder newUpdate(android.net.Uri);
    public java.lang.String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
    public android.content.ContentValues resolveValueBackReferences(android.content.ContentProviderResult[], int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_ASSERT;
    public static int TYPE_DELETE;
    public static int TYPE_INSERT;
    public static int TYPE_UPDATE;
}

-keep class android.content.ContentProviderOperation$Builder {

    public android.content.ContentProviderOperation build();
    public android.content.ContentProviderOperation$Builder withExpectedCount(int);
    public android.content.ContentProviderOperation$Builder withSelection(java.lang.String, java.lang.String[]);
    public android.content.ContentProviderOperation$Builder withSelectionBackReference(int, int);
    public android.content.ContentProviderOperation$Builder withValue(java.lang.String, java.lang.Object);
    public android.content.ContentProviderOperation$Builder withValueBackReference(java.lang.String, int);
    public android.content.ContentProviderOperation$Builder withValueBackReferences(android.content.ContentValues);
    public android.content.ContentProviderOperation$Builder withValues(android.content.ContentValues);
    public android.content.ContentProviderOperation$Builder withYieldAllowed(boolean);


}

-keep class android.content.ContentProviderResult {
    <init>(android.net.Uri);
    <init>(int);
    <init>(android.os.Parcel);
    <init>(android.content.ContentProviderResult, int);

    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.Integer count;
    public android.net.Uri uri;
}

-keep class android.content.ContentResolver {
    <init>(android.content.Context);

    public android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri);
    public android.content.ContentProviderClient acquireContentProviderClient(java.lang.String);
    protected android.content.IContentProvider acquireExistingProvider(android.content.Context, java.lang.String);
    public android.content.IContentProvider acquireExistingProvider(android.net.Uri);
    protected abstract android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String);
    public android.content.IContentProvider acquireProvider(android.net.Uri);
    public android.content.IContentProvider acquireProvider(java.lang.String);
    public android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
    public android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
    protected abstract android.content.IContentProvider acquireUnstableProvider(android.content.Context, java.lang.String);
    public android.content.IContentProvider acquireUnstableProvider(android.net.Uri);
    public android.content.IContentProvider acquireUnstableProvider(java.lang.String);
    public static void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
    public static java.lang.Object addStatusChangeListener(int, android.content.SyncStatusObserver);
    public void appNotRespondingViaProvider(android.content.IContentProvider);
    public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
    public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    public android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
    public void cancelSync(android.net.Uri);
    public static void cancelSync(android.accounts.Account, java.lang.String);
    public static void cancelSync(android.content.SyncRequest);
    public static void cancelSyncAsUser(android.accounts.Account, java.lang.String, int);
    public android.net.Uri canonicalize(android.net.Uri);
    public static android.os.Bundle createSqlQueryBundle(java.lang.String, java.lang.String[], java.lang.String);
    public static java.lang.String createSqlSortClause(android.os.Bundle);
    public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    public android.os.Bundle getCache(android.net.Uri);
    public static android.content.IContentService getContentService();
    public static android.content.SyncInfo getCurrentSync();
    public static java.util.List getCurrentSyncs();
    public static java.util.List getCurrentSyncsAsUser(int);
    public static int getIsSyncable(android.accounts.Account, java.lang.String);
    public static int getIsSyncableAsUser(android.accounts.Account, java.lang.String, int);
    public static boolean getMasterSyncAutomatically();
    public static boolean getMasterSyncAutomaticallyAsUser(int);
    public java.util.List getOutgoingPersistedUriPermissions();
    public java.lang.String getPackageName();
    public static java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String);
    public java.util.List getPersistedUriPermissions();
    public android.content.ContentResolver$OpenResourceIdResult getResourceId(android.net.Uri);
    public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public static java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
    public static android.content.SyncAdapterType[] getSyncAdapterTypes();
    public static android.content.SyncAdapterType[] getSyncAdapterTypesAsUser(int);
    public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
    public static boolean getSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, int);
    public static android.content.SyncStatusInfo getSyncStatus(android.accounts.Account, java.lang.String);
    public static android.content.SyncStatusInfo getSyncStatusAsUser(android.accounts.Account, java.lang.String, int);
    public int getTargetSdkVersion();
    public java.lang.String getType(android.net.Uri);
    public android.graphics.drawable.Drawable getTypeDrawable(java.lang.String);
    public int getUserId();
    public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    public static boolean invalidPeriodicExtras(android.os.Bundle);
    public static boolean isSyncActive(android.accounts.Account, java.lang.String);
    public static boolean isSyncPending(android.accounts.Account, java.lang.String);
    public static boolean isSyncPendingAsUser(android.accounts.Account, java.lang.String, int);
    public void notifyChange(android.net.Uri, android.database.ContentObserver);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, int);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean, int);
    public void notifyChange(android.net.Uri, android.database.ContentObserver, int, int);
    public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String);
    public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
    public java.io.InputStream openInputStream(android.net.Uri);
    public java.io.OutputStream openOutputStream(android.net.Uri);
    public java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
    public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
    public void putCache(android.net.Uri, android.os.Bundle);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
    public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver, int);
    public void releasePersistableUriPermission(android.net.Uri, int);
    public abstract boolean releaseProvider(android.content.IContentProvider);
    public abstract boolean releaseUnstableProvider(android.content.IContentProvider);
    public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public static void removeStatusChangeListener(java.lang.Object);
    public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public static void requestSync(android.content.SyncRequest);
    public static void requestSyncAsUser(android.accounts.Account, java.lang.String, int, android.os.Bundle);
    public int resolveUserId(android.net.Uri);
    public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
    public static void setMasterSyncAutomatically(boolean);
    public static void setMasterSyncAutomaticallyAsUser(boolean, int);
    public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    public static void setSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, boolean, int);
    public void startSync(android.net.Uri, android.os.Bundle);
    public static int syncErrorStringToInt(java.lang.String);
    public static java.lang.String syncErrorToString(int);
    public void takePersistableUriPermission(android.net.Uri, int);
    public void takePersistableUriPermission(java.lang.String, android.net.Uri, int);
    public android.net.Uri uncanonicalize(android.net.Uri);
    public void unregisterContentObserver(android.database.ContentObserver);
    public abstract void unstableProviderDied(android.content.IContentProvider);
    public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
    public static void validateSyncExtrasBundle(android.os.Bundle);


    public static android.content.Intent ACTION_SYNC_CONN_STATUS_CHANGED;
    public static java.lang.String ANY_CURSOR_ITEM_TYPE;
    public static java.lang.String CONTENT_SERVICE_NAME;
    public static java.lang.String CURSOR_DIR_BASE_TYPE;
    public static java.lang.String CURSOR_ITEM_BASE_TYPE;
    public static java.lang.String EXTRA_HONORED_ARGS;
    public static java.lang.String EXTRA_REFRESH_SUPPORTED;
    public static java.lang.String EXTRA_SIZE;
    public static java.lang.String EXTRA_TOTAL_COUNT;
    public static int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS;
    public static int NOTIFY_SYNC_TO_NETWORK;
    public static java.lang.String QUERY_ARG_LIMIT;
    public static java.lang.String QUERY_ARG_OFFSET;
    public static java.lang.String QUERY_ARG_SORT_COLLATION;
    public static java.lang.String QUERY_ARG_SORT_COLUMNS;
    public static java.lang.String QUERY_ARG_SORT_DIRECTION;
    public static java.lang.String QUERY_ARG_SQL_SELECTION;
    public static java.lang.String QUERY_ARG_SQL_SELECTION_ARGS;
    public static java.lang.String QUERY_ARG_SQL_SORT_ORDER;
    public static int QUERY_SORT_DIRECTION_ASCENDING;
    public static int QUERY_SORT_DIRECTION_DESCENDING;
    public static java.lang.String SCHEME_ANDROID_RESOURCE;
    public static java.lang.String SCHEME_CONTENT;
    public static java.lang.String SCHEME_FILE;
    public static int SYNC_ERROR_AUTHENTICATION;
    public static int SYNC_ERROR_CONFLICT;
    public static int SYNC_ERROR_INTERNAL;
    public static int SYNC_ERROR_IO;
    public static int SYNC_ERROR_PARSE;
    public static int SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
    public static int SYNC_ERROR_TOO_MANY_DELETIONS;
    public static int SYNC_ERROR_TOO_MANY_RETRIES;
    public static int SYNC_EXEMPTION_NONE;
    public static int SYNC_EXEMPTION_PROMOTE_BUCKET;
    public static int SYNC_EXEMPTION_PROMOTE_BUCKET_WITH_TEMP;
    public static java.lang.String SYNC_EXTRAS_ACCOUNT;
    public static java.lang.String SYNC_EXTRAS_DISALLOW_METERED;
    public static java.lang.String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS;
    public static java.lang.String SYNC_EXTRAS_DO_NOT_RETRY;
    public static java.lang.String SYNC_EXTRAS_EXPECTED_DOWNLOAD;
    public static java.lang.String SYNC_EXTRAS_EXPECTED_UPLOAD;
    public static java.lang.String SYNC_EXTRAS_EXPEDITED;
    public static java.lang.String SYNC_EXTRAS_FORCE;
    public static java.lang.String SYNC_EXTRAS_IGNORE_BACKOFF;
    public static java.lang.String SYNC_EXTRAS_IGNORE_SETTINGS;
    public static java.lang.String SYNC_EXTRAS_INITIALIZE;
    public static java.lang.String SYNC_EXTRAS_MANUAL;
    public static java.lang.String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS;
    public static java.lang.String SYNC_EXTRAS_PRIORITY;
    public static java.lang.String SYNC_EXTRAS_REQUIRE_CHARGING;
    public static java.lang.String SYNC_EXTRAS_UPLOAD;
    public static int SYNC_OBSERVER_TYPE_ACTIVE;
    public static int SYNC_OBSERVER_TYPE_ALL;
    public static int SYNC_OBSERVER_TYPE_PENDING;
    public static int SYNC_OBSERVER_TYPE_SETTINGS;
    public static int SYNC_OBSERVER_TYPE_STATUS;
    public static java.lang.String SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG;
}

-keep class android.content.ContentResolver$OpenResourceIdResult {
    <init>();



    public int id;
    public android.content.res.Resources r;
}

-keep class android.content.ContentValues {
    <init>();
    <init>(int);
    <init>(android.content.ContentValues);

    public void clear();
    public boolean containsKey(java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.Object get(java.lang.String);
    public java.lang.Boolean getAsBoolean(java.lang.String);
    public java.lang.Byte getAsByte(java.lang.String);
    public byte[] getAsByteArray(java.lang.String);
    public java.lang.Double getAsDouble(java.lang.String);
    public java.lang.Float getAsFloat(java.lang.String);
    public java.lang.Integer getAsInteger(java.lang.String);
    public java.lang.Long getAsLong(java.lang.String);
    public java.lang.Short getAsShort(java.lang.String);
    public java.lang.String getAsString(java.lang.String);
    public java.util.ArrayList getStringArrayList(java.lang.String);
    public int hashCode();
    public boolean isEmpty();
    public java.util.Set keySet();
    public void put(java.lang.String, java.lang.String);
    public void put(java.lang.String, java.lang.Byte);
    public void put(java.lang.String, java.lang.Short);
    public void put(java.lang.String, java.lang.Integer);
    public void put(java.lang.String, java.lang.Long);
    public void put(java.lang.String, java.lang.Float);
    public void put(java.lang.String, java.lang.Double);
    public void put(java.lang.String, java.lang.Boolean);
    public void put(java.lang.String, byte[]);
    public void putAll(android.content.ContentValues);
    public void putNull(java.lang.String);
    public void putStringArrayList(java.lang.String, java.util.ArrayList);
    public void remove(java.lang.String);
    public int size();
    public java.lang.String toString();
    public java.util.Set valueSet();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String TAG;
}

-keep class android.content.Context {
    <init>();

    public void assertRuntimeOverlayThemable();
    public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
    public abstract boolean canLoadUnsafeResources();
    public boolean canStartActivityForResult();
    public abstract int checkCallingOrSelfPermission(java.lang.String);
    public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
    public abstract int checkCallingPermission(java.lang.String);
    public abstract int checkCallingUriPermission(android.net.Uri, int);
    public abstract int checkPermission(java.lang.String, int, int);
    public abstract int checkPermission(java.lang.String, int, int, android.os.IBinder);
    public abstract int checkSelfPermission(java.lang.String);
    public abstract int checkUriPermission(android.net.Uri, int, int, int);
    public abstract int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
    public abstract int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
    public abstract void clearWallpaper();
    public abstract android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
    public abstract android.content.Context createConfigurationContext(android.content.res.Configuration);
    public abstract android.content.Context createContextForSplit(java.lang.String);
    public abstract android.content.Context createCredentialProtectedStorageContext();
    public abstract android.content.Context createDeviceProtectedStorageContext();
    public abstract android.content.Context createDisplayContext(android.view.Display);
    public abstract android.content.Context createPackageContext(java.lang.String, int);
    public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
    public abstract java.lang.String[] databaseList();
    public abstract boolean deleteDatabase(java.lang.String);
    public abstract boolean deleteFile(java.lang.String);
    public abstract boolean deleteSharedPreferences(java.lang.String);
    public abstract void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
    public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
    public abstract void enforceCallingPermission(java.lang.String, java.lang.String);
    public abstract void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
    public abstract void enforcePermission(java.lang.String, int, int, java.lang.String);
    public abstract void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
    public abstract void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
    public abstract java.lang.String[] fileList();
    public android.os.IBinder getActivityToken();
    public abstract android.content.Context getApplicationContext();
    public abstract android.content.pm.ApplicationInfo getApplicationInfo();
    public abstract android.content.res.AssetManager getAssets();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public abstract java.lang.String getBasePackageName();
    public abstract java.io.File getCacheDir();
    public abstract java.lang.ClassLoader getClassLoader();
    public abstract java.io.File getCodeCacheDir();
    public int getColor(int);
    public android.content.res.ColorStateList getColorStateList(int);
    public abstract android.content.ContentResolver getContentResolver();
    public abstract java.io.File getDataDir();
    public abstract java.io.File getDatabasePath(java.lang.String);
    public abstract java.io.File getDir(java.lang.String, int);
    public abstract android.view.Display getDisplay();
    public abstract android.view.DisplayAdjustments getDisplayAdjustments(int);
    public android.graphics.drawable.Drawable getDrawable(int);
    public abstract java.io.File getExternalCacheDir();
    public abstract java.io.File[] getExternalCacheDirs();
    public abstract java.io.File getExternalFilesDir(java.lang.String);
    public abstract java.io.File[] getExternalFilesDirs(java.lang.String);
    public abstract java.io.File[] getExternalMediaDirs();
    public abstract java.io.File getFileStreamPath(java.lang.String);
    public abstract java.io.File getFilesDir();
    public android.app.IApplicationThread getIApplicationThread();
    public java.util.concurrent.Executor getMainExecutor();
    public abstract android.os.Looper getMainLooper();
    public android.os.Handler getMainThreadHandler();
    public int getNextAutofillId();
    public abstract java.io.File getNoBackupFilesDir();
    public abstract java.io.File getObbDir();
    public abstract java.io.File[] getObbDirs();
    public abstract java.lang.String getOpPackageName();
    public abstract java.lang.String getPackageCodePath();
    public abstract android.content.pm.PackageManager getPackageManager();
    public abstract java.lang.String getPackageName();
    public abstract java.lang.String getPackageResourcePath();
    public abstract java.io.File getPreloadsFileCache();
    public abstract android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
    public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    public abstract java.io.File getSharedPreferencesPath(java.lang.String);
    public java.io.File getSharedPrefsFile(java.lang.String);
    public java.lang.String getString(int);
    public java.lang.String getString(int, java.lang.Object[]);
    public abstract java.lang.Object getSystemService(java.lang.String);
    public java.lang.Object getSystemService(java.lang.Class);
    public abstract java.lang.String getSystemServiceName(java.lang.Class);
    public java.lang.CharSequence getText(int);
    public abstract android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    public android.os.UserHandle getUser();
    public int getUserId();
    public abstract android.graphics.drawable.Drawable getWallpaper();
    public abstract int getWallpaperDesiredMinimumHeight();
    public abstract int getWallpaperDesiredMinimumWidth();
    public abstract void grantUriPermission(java.lang.String, android.net.Uri, int);
    public boolean isAutofillCompatibilityEnabled();
    public abstract boolean isCredentialProtectedStorage();
    public abstract boolean isDeviceProtectedStorage();
    public boolean isRestricted();
    public abstract boolean moveDatabaseFrom(android.content.Context, java.lang.String);
    public abstract boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
    public android.content.res.TypedArray obtainStyledAttributes(int[]);
    public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[]);
    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
    public abstract java.io.FileInputStream openFileInput(java.lang.String);
    public abstract java.io.FileOutputStream openFileOutput(java.lang.String, int);
    public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public abstract android.graphics.drawable.Drawable peekWallpaper();
    public void registerComponentCallbacks(android.content.ComponentCallbacks);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
    public abstract android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public abstract void reloadSharedPreferences();
    public abstract void removeStickyBroadcast(android.content.Intent);
    public abstract void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void revokeUriPermission(android.net.Uri, int);
    public abstract void revokeUriPermission(java.lang.String, android.net.Uri, int);
    public abstract void sendBroadcast(android.content.Intent);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
    public abstract void sendBroadcast(android.content.Intent, java.lang.String, int);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
    public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
    public abstract void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
    public abstract void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendStickyBroadcast(android.content.Intent);
    public abstract void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
    public abstract void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public abstract void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
    public void setAutofillCompatibilityEnabled(boolean);
    public abstract void setTheme(int);
    public abstract void setWallpaper(android.graphics.Bitmap);
    public abstract void setWallpaper(java.io.InputStream);
    public abstract void startActivities(android.content.Intent[]);
    public abstract void startActivities(android.content.Intent[], android.os.Bundle);
    public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
    public abstract void startActivity(android.content.Intent);
    public abstract void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
    public abstract android.content.ComponentName startForegroundService(android.content.Intent);
    public abstract android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
    public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public abstract android.content.ComponentName startService(android.content.Intent);
    public abstract android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
    public abstract boolean stopService(android.content.Intent);
    public abstract boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
    public abstract void unbindService(android.content.ServiceConnection);
    public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
    public abstract void unregisterReceiver(android.content.BroadcastReceiver);
    public abstract void updateDisplay(int);


    public static java.lang.String ACCESSIBILITY_SERVICE;
    public static java.lang.String ACCOUNT_SERVICE;
    public static java.lang.String ACTIVITY_SERVICE;
    public static java.lang.String ALARM_SERVICE;
    public static java.lang.String APPWIDGET_SERVICE;
    public static java.lang.String APP_OPS_SERVICE;
    public static java.lang.String AUDIO_SERVICE;
    public static java.lang.String AUTOFILL_MANAGER_SERVICE;
    public static java.lang.String BACKUP_SERVICE;
    public static java.lang.String BATTERY_SERVICE;
    public static int BIND_ABOVE_CLIENT;
    public static int BIND_ADJUST_WITH_ACTIVITY;
    public static int BIND_ALLOW_INSTANT;
    public static int BIND_ALLOW_OOM_MANAGEMENT;
    public static int BIND_ALLOW_WHITELIST_MANAGEMENT;
    public static int BIND_AUTO_CREATE;
    public static int BIND_DEBUG_UNBIND;
    public static int BIND_EXTERNAL_SERVICE;
    public static int BIND_FOREGROUND_SERVICE;
    public static int BIND_FOREGROUND_SERVICE_WHILE_AWAKE;
    public static int BIND_IMPORTANT;
    public static int BIND_IMPORTANT_BACKGROUND;
    public static int BIND_NOT_FOREGROUND;
    public static int BIND_NOT_VISIBLE;
    public static int BIND_SHOWING_UI;
    public static int BIND_TREAT_LIKE_ACTIVITY;
    public static int BIND_VISIBLE;
    public static int BIND_WAIVE_PRIORITY;
    public static java.lang.String BLUETOOTH_SERVICE;
    public static java.lang.String CAMERA_SERVICE;
    public static java.lang.String CAPTIONING_SERVICE;
    public static java.lang.String CARRIER_CONFIG_SERVICE;
    public static java.lang.String CLIPBOARD_SERVICE;
    public static java.lang.String COMPANION_DEVICE_SERVICE;
    public static java.lang.String CONNECTIVITY_SERVICE;
    public static java.lang.String CONSUMER_IR_SERVICE;
    public static java.lang.String CONTEXTHUB_SERVICE;
    public static int CONTEXT_CREDENTIAL_PROTECTED_STORAGE;
    public static int CONTEXT_DEVICE_PROTECTED_STORAGE;
    public static int CONTEXT_IGNORE_SECURITY;
    public static int CONTEXT_INCLUDE_CODE;
    public static int CONTEXT_REGISTER_PACKAGE;
    public static int CONTEXT_RESTRICTED;
    public static java.lang.String COUNTRY_DETECTOR;
    public static java.lang.String CROSS_PROFILE_APPS_SERVICE;
    public static java.lang.String DEVICE_IDENTIFIERS_SERVICE;
    public static java.lang.String DEVICE_IDLE_CONTROLLER;
    public static java.lang.String DEVICE_POLICY_SERVICE;
    public static java.lang.String DISPLAY_SERVICE;
    public static java.lang.String DOWNLOAD_SERVICE;
    public static java.lang.String DROPBOX_SERVICE;
    public static java.lang.String ETHERNET_SERVICE;
    public static java.lang.String EUICC_CARD_SERVICE;
    public static java.lang.String EUICC_SERVICE;
    public static java.lang.String FINGERPRINT_SERVICE;
    public static java.lang.String GATEKEEPER_SERVICE;
    public static java.lang.String HARDWARE_PROPERTIES_SERVICE;
    public static java.lang.String HDMI_CONTROL_SERVICE;
    public static java.lang.String INCIDENT_SERVICE;
    public static java.lang.String INPUT_METHOD_SERVICE;
    public static java.lang.String INPUT_SERVICE;
    public static java.lang.String IPSEC_SERVICE;
    public static java.lang.String JOB_SCHEDULER_SERVICE;
    public static java.lang.String KEYGUARD_SERVICE;
    public static java.lang.String LAUNCHER_APPS_SERVICE;
    public static java.lang.String LAYOUT_INFLATER_SERVICE;
    public static java.lang.String LOCATION_SERVICE;
    public static java.lang.String LOWPAN_SERVICE;
    public static java.lang.String MEDIA_PROJECTION_SERVICE;
    public static java.lang.String MEDIA_ROUTER_SERVICE;
    public static java.lang.String MEDIA_SESSION_SERVICE;
    public static java.lang.String MIDI_SERVICE;
    public static int MODE_APPEND;
    public static int MODE_ENABLE_WRITE_AHEAD_LOGGING;
    public static int MODE_MULTI_PROCESS;
    public static int MODE_NO_LOCALIZED_COLLATORS;
    public static int MODE_PRIVATE;
    public static int MODE_WORLD_READABLE;
    public static int MODE_WORLD_WRITEABLE;
    public static java.lang.String NETWORKMANAGEMENT_SERVICE;
    public static java.lang.String NETWORK_POLICY_SERVICE;
    public static java.lang.String NETWORK_SCORE_SERVICE;
    public static java.lang.String NETWORK_STATS_SERVICE;
    public static java.lang.String NETWORK_WATCHLIST_SERVICE;
    public static java.lang.String NFC_SERVICE;
    public static java.lang.String NOTIFICATION_SERVICE;
    public static java.lang.String NSD_SERVICE;
    public static java.lang.String OEM_LOCK_SERVICE;
    public static java.lang.String OVERLAY_SERVICE;
    public static java.lang.String PERSISTENT_DATA_BLOCK_SERVICE;
    public static java.lang.String POWER_SERVICE;
    public static java.lang.String PRINT_SERVICE;
    public static java.lang.String RADIO_SERVICE;
    public static int RECEIVER_VISIBLE_TO_INSTANT_APPS;
    public static java.lang.String RECOVERY_SERVICE;
    public static java.lang.String RESTRICTIONS_SERVICE;
    public static java.lang.String SEARCH_SERVICE;
    public static java.lang.String SECURE_ELEMENT_SERVICE;
    public static java.lang.String SENSOR_SERVICE;
    public static java.lang.String SERIAL_SERVICE;
    public static java.lang.String SHORTCUT_SERVICE;
    public static java.lang.String SIP_SERVICE;
    public static java.lang.String SLICE_SERVICE;
    public static java.lang.String SOUND_TRIGGER_SERVICE;
    public static java.lang.String STATS_COMPANION_SERVICE;
    public static java.lang.String STATS_MANAGER;
    public static java.lang.String STATUS_BAR_SERVICE;
    public static java.lang.String STORAGE_SERVICE;
    public static java.lang.String STORAGE_STATS_SERVICE;
    public static java.lang.String SYSTEM_HEALTH_SERVICE;
    public static java.lang.String SYSTEM_UPDATE_SERVICE;
    public static java.lang.String TELECOM_SERVICE;
    public static java.lang.String TELEPHONY_SERVICE;
    public static java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE;
    public static java.lang.String TEXT_CLASSIFICATION_SERVICE;
    public static java.lang.String TEXT_SERVICES_MANAGER_SERVICE;
    public static java.lang.String TIME_ZONE_RULES_MANAGER_SERVICE;
    public static java.lang.String TRUST_SERVICE;
    public static java.lang.String TV_INPUT_SERVICE;
    public static java.lang.String UI_MODE_SERVICE;
    public static java.lang.String UPDATE_LOCK_SERVICE;
    public static java.lang.String USAGE_STATS_SERVICE;
    public static java.lang.String USB_SERVICE;
    public static java.lang.String USER_SERVICE;
    public static java.lang.String VIBRATOR_SERVICE;
    public static java.lang.String VOICE_INTERACTION_MANAGER_SERVICE;
    public static java.lang.String VR_SERVICE;
    public static java.lang.String WALLPAPER_SERVICE;
    public static java.lang.String WIFI_AWARE_SERVICE;
    public static java.lang.String WIFI_P2P_SERVICE;
    public static java.lang.String WIFI_RTT_RANGING_SERVICE;
    public static java.lang.String WIFI_RTT_SERVICE;
    public static java.lang.String WIFI_SCANNING_SERVICE;
    public static java.lang.String WIFI_SERVICE;
    public static java.lang.String WINDOW_SERVICE;
}

-keep class android.content.ContextWrapper {
    <init>(android.content.Context);

    protected void attachBaseContext(android.content.Context);
    public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
    public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
    public boolean canLoadUnsafeResources();
    public boolean canStartActivityForResult();
    public int checkCallingOrSelfPermission(java.lang.String);
    public int checkCallingOrSelfUriPermission(android.net.Uri, int);
    public int checkCallingPermission(java.lang.String);
    public int checkCallingUriPermission(android.net.Uri, int);
    public int checkPermission(java.lang.String, int, int);
    public int checkPermission(java.lang.String, int, int, android.os.IBinder);
    public int checkSelfPermission(java.lang.String);
    public int checkUriPermission(android.net.Uri, int, int, int);
    public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
    public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
    public void clearWallpaper();
    public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
    public android.content.Context createConfigurationContext(android.content.res.Configuration);
    public android.content.Context createContextForSplit(java.lang.String);
    public android.content.Context createCredentialProtectedStorageContext();
    public android.content.Context createDeviceProtectedStorageContext();
    public android.content.Context createDisplayContext(android.view.Display);
    public android.content.Context createPackageContext(java.lang.String, int);
    public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
    public java.lang.String[] databaseList();
    public boolean deleteDatabase(java.lang.String);
    public boolean deleteFile(java.lang.String);
    public boolean deleteSharedPreferences(java.lang.String);
    public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
    public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
    public void enforceCallingPermission(java.lang.String, java.lang.String);
    public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
    public void enforcePermission(java.lang.String, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
    public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
    public java.lang.String[] fileList();
    public android.os.IBinder getActivityToken();
    public android.content.Context getApplicationContext();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public android.content.res.AssetManager getAssets();
    public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
    public android.content.Context getBaseContext();
    public java.lang.String getBasePackageName();
    public java.io.File getCacheDir();
    public java.lang.ClassLoader getClassLoader();
    public java.io.File getCodeCacheDir();
    public android.content.ContentResolver getContentResolver();
    public java.io.File getDataDir();
    public java.io.File getDatabasePath(java.lang.String);
    public java.io.File getDir(java.lang.String, int);
    public android.view.Display getDisplay();
    public android.view.DisplayAdjustments getDisplayAdjustments(int);
    public java.io.File getExternalCacheDir();
    public java.io.File[] getExternalCacheDirs();
    public java.io.File getExternalFilesDir(java.lang.String);
    public java.io.File[] getExternalFilesDirs(java.lang.String);
    public java.io.File[] getExternalMediaDirs();
    public java.io.File getFileStreamPath(java.lang.String);
    public java.io.File getFilesDir();
    public android.app.IApplicationThread getIApplicationThread();
    public java.util.concurrent.Executor getMainExecutor();
    public android.os.Looper getMainLooper();
    public android.os.Handler getMainThreadHandler();
    public int getNextAutofillId();
    public java.io.File getNoBackupFilesDir();
    public java.io.File getObbDir();
    public java.io.File[] getObbDirs();
    public java.lang.String getOpPackageName();
    public java.lang.String getPackageCodePath();
    public android.content.pm.PackageManager getPackageManager();
    public java.lang.String getPackageName();
    public java.lang.String getPackageResourcePath();
    public java.io.File getPreloadsFileCache();
    public android.content.res.Resources getResources();
    public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
    public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
    public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
    public java.io.File getSharedPreferencesPath(java.lang.String);
    public java.lang.Object getSystemService(java.lang.String);
    public java.lang.String getSystemServiceName(java.lang.Class);
    public android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    public int getUserId();
    public android.graphics.drawable.Drawable getWallpaper();
    public int getWallpaperDesiredMinimumHeight();
    public int getWallpaperDesiredMinimumWidth();
    public void grantUriPermission(java.lang.String, android.net.Uri, int);
    public boolean isAutofillCompatibilityEnabled();
    public boolean isCredentialProtectedStorage();
    public boolean isDeviceProtectedStorage();
    public boolean isRestricted();
    public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
    public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
    public java.io.FileInputStream openFileInput(java.lang.String);
    public java.io.FileOutputStream openFileOutput(java.lang.String, int);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public android.graphics.drawable.Drawable peekWallpaper();
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
    public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
    public void reloadSharedPreferences();
    public void removeStickyBroadcast(android.content.Intent);
    public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void revokeUriPermission(android.net.Uri, int);
    public void revokeUriPermission(java.lang.String, android.net.Uri, int);
    public void sendBroadcast(android.content.Intent);
    public void sendBroadcast(android.content.Intent, java.lang.String);
    public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
    public void sendBroadcast(android.content.Intent, java.lang.String, int);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
    public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
    public void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
    public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyBroadcast(android.content.Intent);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
    public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
    public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
    public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
    public void setAutofillCompatibilityEnabled(boolean);
    public void setTheme(int);
    public void setWallpaper(android.graphics.Bitmap);
    public void setWallpaper(java.io.InputStream);
    public void startActivities(android.content.Intent[]);
    public void startActivities(android.content.Intent[], android.os.Bundle);
    public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
    public void startActivity(android.content.Intent);
    public void startActivity(android.content.Intent, android.os.Bundle);
    public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
    public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
    public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
    public android.content.ComponentName startForegroundService(android.content.Intent);
    public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
    public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
    public android.content.ComponentName startService(android.content.Intent);
    public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
    public boolean stopService(android.content.Intent);
    public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
    public void unbindService(android.content.ServiceConnection);
    public void unregisterReceiver(android.content.BroadcastReceiver);
    public void updateDisplay(int);


}

-keep class android.content.DialogInterface {

    public abstract void cancel();
    public abstract void dismiss();


    public static int BUTTON1;
    public static int BUTTON2;
    public static int BUTTON3;
    public static int BUTTON_NEGATIVE;
    public static int BUTTON_NEUTRAL;
    public static int BUTTON_POSITIVE;
}

-keep class android.content.DialogInterface$OnCancelListener {

    public abstract void onCancel(android.content.DialogInterface);


}

-keep class android.content.DialogInterface$OnDismissListener {

    public abstract void onDismiss(android.content.DialogInterface);


}

-keep class android.content.DialogInterface$OnKeyListener {

    public abstract boolean onKey(android.content.DialogInterface, int, android.view.KeyEvent);


}

-keep class android.content.DialogInterface$OnShowListener {

    public abstract void onShow(android.content.DialogInterface);


}

-keep class android.content.IContentProvider {

    public abstract android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
    public abstract int bulkInsert(java.lang.String, android.net.Uri, android.content.ContentValues[]);
    public abstract android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle);
    public abstract android.net.Uri canonicalize(java.lang.String, android.net.Uri);
    public abstract android.os.ICancellationSignal createCancellationSignal();
    public abstract int delete(java.lang.String, android.net.Uri, java.lang.String, java.lang.String[]);
    public abstract java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    public abstract java.lang.String getType(android.net.Uri);
    public abstract android.net.Uri insert(java.lang.String, android.net.Uri, android.content.ContentValues);
    public abstract android.content.res.AssetFileDescriptor openAssetFile(java.lang.String, android.net.Uri, java.lang.String, android.os.ICancellationSignal);
    public abstract android.os.ParcelFileDescriptor openFile(java.lang.String, android.net.Uri, java.lang.String, android.os.ICancellationSignal, android.os.IBinder);
    public abstract android.content.res.AssetFileDescriptor openTypedAssetFile(java.lang.String, android.net.Uri, java.lang.String, android.os.Bundle, android.os.ICancellationSignal);
    public abstract android.database.Cursor query(java.lang.String, android.net.Uri, java.lang.String[], android.os.Bundle, android.os.ICancellationSignal);
    public abstract boolean refresh(java.lang.String, android.net.Uri, android.os.Bundle, android.os.ICancellationSignal);
    public abstract android.net.Uri uncanonicalize(java.lang.String, android.net.Uri);
    public abstract int update(java.lang.String, android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);


    public static int APPLY_BATCH_TRANSACTION;
    public static int BULK_INSERT_TRANSACTION;
    public static int CALL_TRANSACTION;
    public static int CANONICALIZE_TRANSACTION;
    public static int CREATE_CANCELATION_SIGNAL_TRANSACTION;
    public static int DELETE_TRANSACTION;
    public static int GET_STREAM_TYPES_TRANSACTION;
    public static int GET_TYPE_TRANSACTION;
    public static int INSERT_TRANSACTION;
    public static int OPEN_ASSET_FILE_TRANSACTION;
    public static int OPEN_FILE_TRANSACTION;
    public static int OPEN_TYPED_ASSET_FILE_TRANSACTION;
    public static int QUERY_TRANSACTION;
    public static int REFRESH_TRANSACTION;
    public static int UNCANONICALIZE_TRANSACTION;
    public static int UPDATE_TRANSACTION;
    public static java.lang.String descriptor;
}

-keep class android.content.IContentService {

    public abstract void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
    public abstract void addStatusChangeListener(int, android.content.ISyncStatusObserver);
    public abstract void cancelRequest(android.content.SyncRequest);
    public abstract void cancelSync(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract void cancelSyncAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
    public abstract android.os.Bundle getCache(java.lang.String, android.net.Uri, int);
    public abstract java.util.List getCurrentSyncs();
    public abstract java.util.List getCurrentSyncsAsUser(int);
    public abstract int getIsSyncable(android.accounts.Account, java.lang.String);
    public abstract int getIsSyncableAsUser(android.accounts.Account, java.lang.String, int);
    public abstract boolean getMasterSyncAutomatically();
    public abstract boolean getMasterSyncAutomaticallyAsUser(int);
    public abstract java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
    public abstract android.content.SyncAdapterType[] getSyncAdapterTypes();
    public abstract android.content.SyncAdapterType[] getSyncAdapterTypesAsUser(int);
    public abstract boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
    public abstract boolean getSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, int);
    public abstract android.content.SyncStatusInfo getSyncStatus(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract android.content.SyncStatusInfo getSyncStatusAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
    public abstract boolean isSyncActive(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract boolean isSyncPending(android.accounts.Account, java.lang.String, android.content.ComponentName);
    public abstract boolean isSyncPendingAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
    public abstract void notifyChange(android.net.Uri, android.database.IContentObserver, boolean, int, int, int);
    public abstract void putCache(java.lang.String, android.net.Uri, android.os.Bundle, int);
    public abstract void registerContentObserver(android.net.Uri, boolean, android.database.IContentObserver, int, int);
    public abstract void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public abstract void removeStatusChangeListener(android.content.ISyncStatusObserver);
    public abstract void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    public abstract void resetTodayStats();
    public abstract void setIsSyncable(android.accounts.Account, java.lang.String, int);
    public abstract void setMasterSyncAutomatically(boolean);
    public abstract void setMasterSyncAutomaticallyAsUser(boolean, int);
    public abstract void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    public abstract void setSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, boolean, int);
    public abstract void sync(android.content.SyncRequest);
    public abstract void syncAsUser(android.content.SyncRequest, int);
    public abstract void unregisterContentObserver(android.database.IContentObserver);


}

-keep class android.content.IIntentReceiver {

    public abstract void performReceive(android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int);


}

-keep class android.content.IIntentSender {

    public abstract void send(int, android.content.Intent, java.lang.String, android.os.IBinder, android.content.IIntentReceiver, java.lang.String, android.os.Bundle);


}

-keep class android.content.ISyncStatusObserver {

    public abstract void onStatusChanged(int);


}

-keep class android.content.Intent {
    <init>();
    <init>(android.content.Intent);
    <init>(java.lang.String);
    <init>(java.lang.String, android.net.Uri);
    <init>(android.content.Context, java.lang.Class);
    <init>(java.lang.String, android.net.Uri, android.content.Context, java.lang.Class);
    <init>(android.os.Parcel);

    public android.content.Intent addCategory(java.lang.String);
    public android.content.Intent addFlags(int);
    public boolean canStripForHistory();
    public java.lang.Object clone();
    public android.content.Intent cloneFilter();
    public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence);
    public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender);
    public int describeContents();
    public static java.lang.String dockStateToString(int);
    public int fillIn(android.content.Intent, int);
    public boolean filterEquals(android.content.Intent);
    public int filterHashCode();
    public void fixUris(int);
    public java.lang.String getAction();
    public boolean[] getBooleanArrayExtra(java.lang.String);
    public boolean getBooleanExtra(java.lang.String, boolean);
    public android.os.Bundle getBundleExtra(java.lang.String);
    public byte[] getByteArrayExtra(java.lang.String);
    public byte getByteExtra(java.lang.String, byte);
    public java.util.Set getCategories();
    public char[] getCharArrayExtra(java.lang.String);
    public char getCharExtra(java.lang.String, char);
    public java.lang.CharSequence[] getCharSequenceArrayExtra(java.lang.String);
    public java.util.ArrayList getCharSequenceArrayListExtra(java.lang.String);
    public java.lang.CharSequence getCharSequenceExtra(java.lang.String);
    public android.content.ClipData getClipData();
    public android.content.ComponentName getComponent();
    public int getContentUserHint();
    public android.net.Uri getData();
    public java.lang.String getDataString();
    public double[] getDoubleArrayExtra(java.lang.String);
    public double getDoubleExtra(java.lang.String, double);
    public java.lang.Object getExtra(java.lang.String);
    public java.lang.Object getExtra(java.lang.String, java.lang.Object);
    public android.os.Bundle getExtras();
    public int getFlags();
    public float[] getFloatArrayExtra(java.lang.String);
    public float getFloatExtra(java.lang.String, float);
    public android.os.IBinder getIBinderExtra(java.lang.String);
    public int[] getIntArrayExtra(java.lang.String);
    public int getIntExtra(java.lang.String, int);
    public java.util.ArrayList getIntegerArrayListExtra(java.lang.String);
    public static android.content.Intent getIntent(java.lang.String);
    public static android.content.Intent getIntentOld(java.lang.String);
    public java.lang.String getLaunchToken();
    public long[] getLongArrayExtra(java.lang.String);
    public long getLongExtra(java.lang.String, long);
    public java.lang.String getPackage();
    public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
    public java.util.ArrayList getParcelableArrayListExtra(java.lang.String);
    public android.os.Parcelable getParcelableExtra(java.lang.String);
    public java.lang.String getScheme();
    public android.content.Intent getSelector();
    public java.io.Serializable getSerializableExtra(java.lang.String);
    public short[] getShortArrayExtra(java.lang.String);
    public short getShortExtra(java.lang.String, short);
    public android.graphics.Rect getSourceBounds();
    public java.lang.String[] getStringArrayExtra(java.lang.String);
    public java.util.ArrayList getStringArrayListExtra(java.lang.String);
    public java.lang.String getStringExtra(java.lang.String);
    public java.lang.String getType();
    public boolean hasCategory(java.lang.String);
    public boolean hasExtra(java.lang.String);
    public boolean hasFileDescriptors();
    public boolean hasWebURI();
    public static boolean isAccessUriMode(int);
    public boolean isDocument();
    public boolean isExcludingStopped();
    public boolean isWebIntent();
    public static android.content.Intent makeMainActivity(android.content.ComponentName);
    public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
    public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
    public android.content.Intent maybeStripForHistory();
    public boolean migrateExtraStreamToClipData();
    public static java.lang.String normalizeMimeType(java.lang.String);
    public static android.content.Intent parseCommandArgs(android.os.ShellCommand, android.content.Intent$CommandOptionHandler);
    public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    public static android.content.Intent parseUri(java.lang.String, int);
    public void prepareToEnterProcess();
    public void prepareToLeaveProcess(android.content.Context);
    public void prepareToLeaveProcess(boolean);
    public void prepareToLeaveUser(int);
    public static void printIntentArgsHelp(java.io.PrintWriter, java.lang.String);
    public android.content.Intent putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList);
    public android.content.Intent putExtra(java.lang.String, boolean);
    public android.content.Intent putExtra(java.lang.String, byte);
    public android.content.Intent putExtra(java.lang.String, char);
    public android.content.Intent putExtra(java.lang.String, short);
    public android.content.Intent putExtra(java.lang.String, int);
    public android.content.Intent putExtra(java.lang.String, long);
    public android.content.Intent putExtra(java.lang.String, float);
    public android.content.Intent putExtra(java.lang.String, double);
    public android.content.Intent putExtra(java.lang.String, java.lang.String);
    public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence);
    public android.content.Intent putExtra(java.lang.String, android.os.Parcelable);
    public android.content.Intent putExtra(java.lang.String, android.os.Parcelable[]);
    public android.content.Intent putExtra(java.lang.String, java.io.Serializable);
    public android.content.Intent putExtra(java.lang.String, boolean[]);
    public android.content.Intent putExtra(java.lang.String, byte[]);
    public android.content.Intent putExtra(java.lang.String, short[]);
    public android.content.Intent putExtra(java.lang.String, char[]);
    public android.content.Intent putExtra(java.lang.String, int[]);
    public android.content.Intent putExtra(java.lang.String, long[]);
    public android.content.Intent putExtra(java.lang.String, float[]);
    public android.content.Intent putExtra(java.lang.String, double[]);
    public android.content.Intent putExtra(java.lang.String, java.lang.String[]);
    public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence[]);
    public android.content.Intent putExtra(java.lang.String, android.os.Bundle);
    public android.content.Intent putExtra(java.lang.String, android.os.IBinder);
    public android.content.Intent putExtras(android.content.Intent);
    public android.content.Intent putExtras(android.os.Bundle);
    public android.content.Intent putIntegerArrayListExtra(java.lang.String, java.util.ArrayList);
    public android.content.Intent putParcelableArrayListExtra(java.lang.String, java.util.ArrayList);
    public android.content.Intent putStringArrayListExtra(java.lang.String, java.util.ArrayList);
    public void readFromParcel(android.os.Parcel);
    public void removeCategory(java.lang.String);
    public void removeExtra(java.lang.String);
    public void removeFlags(int);
    public void removeUnsafeExtras();
    public android.content.Intent replaceExtras(android.content.Intent);
    public android.content.Intent replaceExtras(android.os.Bundle);
    public android.content.ComponentName resolveActivity(android.content.pm.PackageManager);
    public android.content.pm.ActivityInfo resolveActivityInfo(android.content.pm.PackageManager, int);
    public android.content.ComponentName resolveSystemService(android.content.pm.PackageManager, int);
    public java.lang.String resolveType(android.content.Context);
    public java.lang.String resolveType(android.content.ContentResolver);
    public java.lang.String resolveTypeIfNeeded(android.content.ContentResolver);
    public static android.content.Intent restoreFromXml(org.xmlpull.v1.XmlPullParser);
    public void saveToXml(org.xmlpull.v1.XmlSerializer);
    public android.content.Intent setAction(java.lang.String);
    public void setAllowFds(boolean);
    public android.content.Intent setClass(android.content.Context, java.lang.Class);
    public android.content.Intent setClassName(android.content.Context, java.lang.String);
    public android.content.Intent setClassName(java.lang.String, java.lang.String);
    public void setClipData(android.content.ClipData);
    public android.content.Intent setComponent(android.content.ComponentName);
    public android.content.Intent setData(android.net.Uri);
    public android.content.Intent setDataAndNormalize(android.net.Uri);
    public android.content.Intent setDataAndType(android.net.Uri, java.lang.String);
    public android.content.Intent setDataAndTypeAndNormalize(android.net.Uri, java.lang.String);
    public void setDefusable(boolean);
    public void setExtrasClassLoader(java.lang.ClassLoader);
    public android.content.Intent setFlags(int);
    public void setLaunchToken(java.lang.String);
    public android.content.Intent setPackage(java.lang.String);
    public void setSelector(android.content.Intent);
    public void setSourceBounds(android.graphics.Rect);
    public android.content.Intent setType(java.lang.String);
    public android.content.Intent setTypeAndNormalize(java.lang.String);
    public java.lang.String toInsecureString();
    public java.lang.String toInsecureStringWithClip();
    public java.lang.String toShortString(boolean, boolean, boolean, boolean);
    public void toShortString(java.lang.StringBuilder, boolean, boolean, boolean, boolean);
    public java.lang.String toString();
    public java.lang.String toURI();
    public java.lang.String toUri(int);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public void writeToProto(android.util.proto.ProtoOutputStream, long, boolean, boolean, boolean, boolean);


    public static java.lang.String ACTION_ADVANCED_SETTINGS_CHANGED;
    public static java.lang.String ACTION_AIRPLANE_MODE_CHANGED;
    public static java.lang.String ACTION_ALARM_CHANGED;
    public static java.lang.String ACTION_ALL_APPS;
    public static java.lang.String ACTION_ANSWER;
    public static java.lang.String ACTION_APPLICATION_PREFERENCES;
    public static java.lang.String ACTION_APPLICATION_RESTRICTIONS_CHANGED;
    public static java.lang.String ACTION_APP_ERROR;
    public static java.lang.String ACTION_ASSIST;
    public static java.lang.String ACTION_ATTACH_DATA;
    public static java.lang.String ACTION_BATTERY_CHANGED;
    public static java.lang.String ACTION_BATTERY_LEVEL_CHANGED;
    public static java.lang.String ACTION_BATTERY_LOW;
    public static java.lang.String ACTION_BATTERY_OKAY;
    public static java.lang.String ACTION_BOOT_COMPLETED;
    public static java.lang.String ACTION_BUG_REPORT;
    public static java.lang.String ACTION_CALL;
    public static java.lang.String ACTION_CALL_BUTTON;
    public static java.lang.String ACTION_CALL_EMERGENCY;
    public static java.lang.String ACTION_CALL_PRIVILEGED;
    public static java.lang.String ACTION_CAMERA_BUTTON;
    public static java.lang.String ACTION_CARRIER_SETUP;
    public static java.lang.String ACTION_CHOOSER;
    public static java.lang.String ACTION_CLEAR_DNS_CACHE;
    public static java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS;
    public static java.lang.String ACTION_CONFIGURATION_CHANGED;
    public static java.lang.String ACTION_CREATE_DOCUMENT;
    public static java.lang.String ACTION_CREATE_SHORTCUT;
    public static java.lang.String ACTION_DATE_CHANGED;
    public static java.lang.String ACTION_DEFAULT;
    public static java.lang.String ACTION_DELETE;
    public static java.lang.String ACTION_DEVICE_INITIALIZATION_WIZARD;
    public static java.lang.String ACTION_DEVICE_LOCKED_CHANGED;
    public static java.lang.String ACTION_DEVICE_STORAGE_FULL;
    public static java.lang.String ACTION_DEVICE_STORAGE_LOW;
    public static java.lang.String ACTION_DEVICE_STORAGE_NOT_FULL;
    public static java.lang.String ACTION_DEVICE_STORAGE_OK;
    public static java.lang.String ACTION_DIAL;
    public static java.lang.String ACTION_DISMISS_KEYBOARD_SHORTCUTS;
    public static java.lang.String ACTION_DOCK_ACTIVE;
    public static java.lang.String ACTION_DOCK_EVENT;
    public static java.lang.String ACTION_DOCK_IDLE;
    public static java.lang.String ACTION_DREAMING_STARTED;
    public static java.lang.String ACTION_DREAMING_STOPPED;
    public static java.lang.String ACTION_DYNAMIC_SENSOR_CHANGED;
    public static java.lang.String ACTION_EDIT;
    public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
    public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
    public static java.lang.String ACTION_FACTORY_RESET;
    public static java.lang.String ACTION_FACTORY_TEST;
    public static java.lang.String ACTION_GET_CONTENT;
    public static java.lang.String ACTION_GET_RESTRICTION_ENTRIES;
    public static java.lang.String ACTION_GLOBAL_BUTTON;
    public static java.lang.String ACTION_GTALK_SERVICE_CONNECTED;
    public static java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED;
    public static java.lang.String ACTION_HEADSET_PLUG;
    public static java.lang.String ACTION_IDLE_MAINTENANCE_END;
    public static java.lang.String ACTION_IDLE_MAINTENANCE_START;
    public static java.lang.String ACTION_INPUT_METHOD_CHANGED;
    public static java.lang.String ACTION_INSERT;
    public static java.lang.String ACTION_INSERT_OR_EDIT;
    public static java.lang.String ACTION_INSTALL_FAILURE;
    public static java.lang.String ACTION_INSTALL_INSTANT_APP_PACKAGE;
    public static java.lang.String ACTION_INSTALL_PACKAGE;
    public static java.lang.String ACTION_INSTANT_APP_RESOLVER_SETTINGS;
    public static java.lang.String ACTION_INTENT_FILTER_NEEDS_VERIFICATION;
    public static java.lang.String ACTION_LOCALE_CHANGED;
    public static java.lang.String ACTION_LOCKED_BOOT_COMPLETED;
    public static java.lang.String ACTION_MAIN;
    public static java.lang.String ACTION_MANAGED_PROFILE_ADDED;
    public static java.lang.String ACTION_MANAGED_PROFILE_AVAILABLE;
    public static java.lang.String ACTION_MANAGED_PROFILE_REMOVED;
    public static java.lang.String ACTION_MANAGED_PROFILE_UNAVAILABLE;
    public static java.lang.String ACTION_MANAGED_PROFILE_UNLOCKED;
    public static java.lang.String ACTION_MANAGE_APP_PERMISSIONS;
    public static java.lang.String ACTION_MANAGE_NETWORK_USAGE;
    public static java.lang.String ACTION_MANAGE_PACKAGE_STORAGE;
    public static java.lang.String ACTION_MANAGE_PERMISSIONS;
    public static java.lang.String ACTION_MANAGE_PERMISSION_APPS;
    public static java.lang.String ACTION_MASTER_CLEAR;
    public static java.lang.String ACTION_MASTER_CLEAR_NOTIFICATION;
    public static java.lang.String ACTION_MEDIA_BAD_REMOVAL;
    public static java.lang.String ACTION_MEDIA_BUTTON;
    public static java.lang.String ACTION_MEDIA_CHECKING;
    public static java.lang.String ACTION_MEDIA_EJECT;
    public static java.lang.String ACTION_MEDIA_MOUNTED;
    public static java.lang.String ACTION_MEDIA_NOFS;
    public static java.lang.String ACTION_MEDIA_REMOVED;
    public static java.lang.String ACTION_MEDIA_RESOURCE_GRANTED;
    public static java.lang.String ACTION_MEDIA_SCANNER_FINISHED;
    public static java.lang.String ACTION_MEDIA_SCANNER_SCAN_FILE;
    public static java.lang.String ACTION_MEDIA_SCANNER_STARTED;
    public static java.lang.String ACTION_MEDIA_SHARED;
    public static java.lang.String ACTION_MEDIA_UNMOUNTABLE;
    public static java.lang.String ACTION_MEDIA_UNMOUNTED;
    public static java.lang.String ACTION_MEDIA_UNSHARED;
    public static java.lang.String ACTION_MY_PACKAGE_REPLACED;
    public static java.lang.String ACTION_MY_PACKAGE_SUSPENDED;
    public static java.lang.String ACTION_MY_PACKAGE_UNSUSPENDED;
    public static java.lang.String ACTION_NEW_OUTGOING_CALL;
    public static java.lang.String ACTION_OPEN_DOCUMENT;
    public static java.lang.String ACTION_OPEN_DOCUMENT_TREE;
    public static java.lang.String ACTION_OVERLAY_CHANGED;
    public static java.lang.String ACTION_PACKAGES_SUSPENDED;
    public static java.lang.String ACTION_PACKAGES_UNSUSPENDED;
    public static java.lang.String ACTION_PACKAGE_ADDED;
    public static java.lang.String ACTION_PACKAGE_CHANGED;
    public static java.lang.String ACTION_PACKAGE_DATA_CLEARED;
    public static java.lang.String ACTION_PACKAGE_FIRST_LAUNCH;
    public static java.lang.String ACTION_PACKAGE_FULLY_REMOVED;
    public static java.lang.String ACTION_PACKAGE_INSTALL;
    public static java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION;
    public static java.lang.String ACTION_PACKAGE_REMOVED;
    public static java.lang.String ACTION_PACKAGE_REPLACED;
    public static java.lang.String ACTION_PACKAGE_RESTARTED;
    public static java.lang.String ACTION_PACKAGE_VERIFIED;
    public static java.lang.String ACTION_PASTE;
    public static java.lang.String ACTION_PICK;
    public static java.lang.String ACTION_PICK_ACTIVITY;
    public static java.lang.String ACTION_POWER_CONNECTED;
    public static java.lang.String ACTION_POWER_DISCONNECTED;
    public static java.lang.String ACTION_POWER_USAGE_SUMMARY;
    public static java.lang.String ACTION_PREFERRED_ACTIVITY_CHANGED;
    public static java.lang.String ACTION_PRE_BOOT_COMPLETED;
    public static java.lang.String ACTION_PROCESS_TEXT;
    public static java.lang.String ACTION_PROVIDER_CHANGED;
    public static java.lang.String ACTION_QUERY_PACKAGE_RESTART;
    public static java.lang.String ACTION_QUICK_CLOCK;
    public static java.lang.String ACTION_QUICK_VIEW;
    public static java.lang.String ACTION_REBOOT;
    public static java.lang.String ACTION_REMOTE_INTENT;
    public static java.lang.String ACTION_REQUEST_SHUTDOWN;
    public static java.lang.String ACTION_RESOLVE_INSTANT_APP_PACKAGE;
    public static java.lang.String ACTION_REVIEW_PERMISSIONS;
    public static java.lang.String ACTION_RUN;
    public static java.lang.String ACTION_SCREEN_OFF;
    public static java.lang.String ACTION_SCREEN_ON;
    public static java.lang.String ACTION_SEARCH;
    public static java.lang.String ACTION_SEARCH_LONG_PRESS;
    public static java.lang.String ACTION_SEND;
    public static java.lang.String ACTION_SENDTO;
    public static java.lang.String ACTION_SEND_MULTIPLE;
    public static java.lang.String ACTION_SERVICE_STATE;
    public static java.lang.String ACTION_SETTING_RESTORED;
    public static java.lang.String ACTION_SET_WALLPAPER;
    public static java.lang.String ACTION_SHOW_APP_INFO;
    public static java.lang.String ACTION_SHOW_BRIGHTNESS_DIALOG;
    public static java.lang.String ACTION_SHOW_KEYBOARD_SHORTCUTS;
    public static java.lang.String ACTION_SHOW_SUSPENDED_APP_DETAILS;
    public static java.lang.String ACTION_SHUTDOWN;
    public static java.lang.String ACTION_SIM_STATE_CHANGED;
    public static java.lang.String ACTION_SPLIT_CONFIGURATION_CHANGED;
    public static java.lang.String ACTION_SYNC;
    public static java.lang.String ACTION_SYSTEM_TUTORIAL;
    public static java.lang.String ACTION_THERMAL_EVENT;
    public static java.lang.String ACTION_TIMEZONE_CHANGED;
    public static java.lang.String ACTION_TIME_CHANGED;
    public static java.lang.String ACTION_TIME_TICK;
    public static java.lang.String ACTION_UID_REMOVED;
    public static java.lang.String ACTION_UMS_CONNECTED;
    public static java.lang.String ACTION_UMS_DISCONNECTED;
    public static java.lang.String ACTION_UNINSTALL_PACKAGE;
    public static java.lang.String ACTION_UPGRADE_SETUP;
    public static java.lang.String ACTION_USER_ADDED;
    public static java.lang.String ACTION_USER_BACKGROUND;
    public static java.lang.String ACTION_USER_FOREGROUND;
    public static java.lang.String ACTION_USER_INFO_CHANGED;
    public static java.lang.String ACTION_USER_INITIALIZE;
    public static java.lang.String ACTION_USER_PRESENT;
    public static java.lang.String ACTION_USER_REMOVED;
    public static java.lang.String ACTION_USER_STARTED;
    public static java.lang.String ACTION_USER_STARTING;
    public static java.lang.String ACTION_USER_STOPPED;
    public static java.lang.String ACTION_USER_STOPPING;
    public static java.lang.String ACTION_USER_SWITCHED;
    public static java.lang.String ACTION_USER_UNLOCKED;
    public static java.lang.String ACTION_VIEW;
    public static java.lang.String ACTION_VOICE_ASSIST;
    public static java.lang.String ACTION_VOICE_COMMAND;
    public static java.lang.String ACTION_WALLPAPER_CHANGED;
    public static java.lang.String ACTION_WEB_SEARCH;
    public static java.lang.String CATEGORY_ALTERNATIVE;
    public static java.lang.String CATEGORY_APP_BROWSER;
    public static java.lang.String CATEGORY_APP_CALCULATOR;
    public static java.lang.String CATEGORY_APP_CALENDAR;
    public static java.lang.String CATEGORY_APP_CONTACTS;
    public static java.lang.String CATEGORY_APP_EMAIL;
    public static java.lang.String CATEGORY_APP_GALLERY;
    public static java.lang.String CATEGORY_APP_MAPS;
    public static java.lang.String CATEGORY_APP_MARKET;
    public static java.lang.String CATEGORY_APP_MESSAGING;
    public static java.lang.String CATEGORY_APP_MUSIC;
    public static java.lang.String CATEGORY_BROWSABLE;
    public static java.lang.String CATEGORY_CAR_DOCK;
    public static java.lang.String CATEGORY_CAR_LAUNCHER;
    public static java.lang.String CATEGORY_CAR_MODE;
    public static java.lang.String CATEGORY_DEFAULT;
    public static java.lang.String CATEGORY_DESK_DOCK;
    public static java.lang.String CATEGORY_DEVELOPMENT_PREFERENCE;
    public static java.lang.String CATEGORY_EMBED;
    public static java.lang.String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST;
    public static java.lang.String CATEGORY_HE_DESK_DOCK;
    public static java.lang.String CATEGORY_HOME;
    public static java.lang.String CATEGORY_HOME_MAIN;
    public static java.lang.String CATEGORY_INFO;
    public static java.lang.String CATEGORY_LAUNCHER;
    public static java.lang.String CATEGORY_LAUNCHER_APP;
    public static java.lang.String CATEGORY_LEANBACK_LAUNCHER;
    public static java.lang.String CATEGORY_LEANBACK_SETTINGS;
    public static java.lang.String CATEGORY_LE_DESK_DOCK;
    public static java.lang.String CATEGORY_MONKEY;
    public static java.lang.String CATEGORY_OPENABLE;
    public static java.lang.String CATEGORY_PREFERENCE;
    public static java.lang.String CATEGORY_SAMPLE_CODE;
    public static java.lang.String CATEGORY_SELECTED_ALTERNATIVE;
    public static java.lang.String CATEGORY_SETUP_WIZARD;
    public static java.lang.String CATEGORY_TAB;
    public static java.lang.String CATEGORY_TEST;
    public static java.lang.String CATEGORY_TYPED_OPENABLE;
    public static java.lang.String CATEGORY_UNIT_TEST;
    public static java.lang.String CATEGORY_VOICE;
    public static java.lang.String CATEGORY_VR_HOME;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_ALARM_COUNT;
    public static java.lang.String EXTRA_ALLOW_MULTIPLE;
    public static java.lang.String EXTRA_ALLOW_REPLACE;
    public static java.lang.String EXTRA_ALTERNATE_INTENTS;
    public static java.lang.String EXTRA_ASSIST_CONTEXT;
    public static java.lang.String EXTRA_ASSIST_INPUT_DEVICE_ID;
    public static java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD;
    public static java.lang.String EXTRA_ASSIST_PACKAGE;
    public static java.lang.String EXTRA_ASSIST_UID;
    public static java.lang.String EXTRA_AUTO_LAUNCH_SINGLE_CHOICE;
    public static java.lang.String EXTRA_BCC;
    public static java.lang.String EXTRA_BUG_REPORT;
    public static java.lang.String EXTRA_CALLING_PACKAGE;
    public static java.lang.String EXTRA_CC;
    public static java.lang.String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR;
    public static java.lang.String EXTRA_CDMA_ROAMING_INDICATOR;
    public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME;
    public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST;
    public static java.lang.String EXTRA_CHANGED_PACKAGE_LIST;
    public static java.lang.String EXTRA_CHANGED_UID_LIST;
    public static java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER;
    public static java.lang.String EXTRA_CHOOSER_TARGETS;
    public static java.lang.String EXTRA_CHOSEN_COMPONENT;
    public static java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER;
    public static java.lang.String EXTRA_CLIENT_INTENT;
    public static java.lang.String EXTRA_CLIENT_LABEL;
    public static java.lang.String EXTRA_COMPONENT_NAME;
    public static java.lang.String EXTRA_CONTENT_ANNOTATIONS;
    public static java.lang.String EXTRA_CSS_INDICATOR;
    public static java.lang.String EXTRA_DATA_OPERATOR_ALPHA_LONG;
    public static java.lang.String EXTRA_DATA_OPERATOR_ALPHA_SHORT;
    public static java.lang.String EXTRA_DATA_OPERATOR_NUMERIC;
    public static java.lang.String EXTRA_DATA_RADIO_TECH;
    public static java.lang.String EXTRA_DATA_REG_STATE;
    public static java.lang.String EXTRA_DATA_REMOVED;
    public static java.lang.String EXTRA_DATA_ROAMING_TYPE;
    public static java.lang.String EXTRA_DOCK_STATE;
    public static int EXTRA_DOCK_STATE_CAR;
    public static int EXTRA_DOCK_STATE_DESK;
    public static int EXTRA_DOCK_STATE_HE_DESK;
    public static int EXTRA_DOCK_STATE_LE_DESK;
    public static int EXTRA_DOCK_STATE_UNDOCKED;
    public static java.lang.String EXTRA_DONT_KILL_APP;
    public static java.lang.String EXTRA_EMAIL;
    public static java.lang.String EXTRA_EMERGENCY_ONLY;
    public static java.lang.String EXTRA_EPHEMERAL_FAILURE;
    public static java.lang.String EXTRA_EPHEMERAL_HOSTNAME;
    public static java.lang.String EXTRA_EPHEMERAL_SUCCESS;
    public static java.lang.String EXTRA_EPHEMERAL_TOKEN;
    public static java.lang.String EXTRA_EXCLUDE_COMPONENTS;
    public static java.lang.String EXTRA_FORCE_FACTORY_RESET;
    public static java.lang.String EXTRA_FORCE_MASTER_CLEAR;
    public static java.lang.String EXTRA_FROM_STORAGE;
    public static java.lang.String EXTRA_HTML_TEXT;
    public static java.lang.String EXTRA_INDEX;
    public static java.lang.String EXTRA_INITIAL_INTENTS;
    public static java.lang.String EXTRA_INSTALLER_PACKAGE_NAME;
    public static java.lang.String EXTRA_INSTALL_RESULT;
    public static java.lang.String EXTRA_INSTANT_APP_ACTION;
    public static java.lang.String EXTRA_INSTANT_APP_BUNDLES;
    public static java.lang.String EXTRA_INSTANT_APP_EXTRAS;
    public static java.lang.String EXTRA_INSTANT_APP_FAILURE;
    public static java.lang.String EXTRA_INSTANT_APP_HOSTNAME;
    public static java.lang.String EXTRA_INSTANT_APP_SUCCESS;
    public static java.lang.String EXTRA_INSTANT_APP_TOKEN;
    public static java.lang.String EXTRA_INTENT;
    public static java.lang.String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION;
    public static java.lang.String EXTRA_IS_USING_CARRIER_AGGREGATION;
    public static java.lang.String EXTRA_KEY_CONFIRM;
    public static java.lang.String EXTRA_KEY_EVENT;
    public static java.lang.String EXTRA_LAUNCHER_EXTRAS;
    public static java.lang.String EXTRA_LOCAL_ONLY;
    public static java.lang.String EXTRA_LONG_VERSION_CODE;
    public static java.lang.String EXTRA_LTE_EARFCN_RSRP_BOOST;
    public static java.lang.String EXTRA_MANUAL;
    public static java.lang.String EXTRA_MEDIA_RESOURCE_TYPE;
    public static int EXTRA_MEDIA_RESOURCE_TYPE_AUDIO_CODEC;
    public static int EXTRA_MEDIA_RESOURCE_TYPE_VIDEO_CODEC;
    public static java.lang.String EXTRA_MIME_TYPES;
    public static java.lang.String EXTRA_NETWORK_ID;
    public static java.lang.String EXTRA_NOT_UNKNOWN_SOURCE;
    public static java.lang.String EXTRA_OPERATOR_ALPHA_LONG;
    public static java.lang.String EXTRA_OPERATOR_ALPHA_SHORT;
    public static java.lang.String EXTRA_OPERATOR_NUMERIC;
    public static java.lang.String EXTRA_ORIGINATING_UID;
    public static java.lang.String EXTRA_ORIGINATING_URI;
    public static java.lang.String EXTRA_PACKAGES;
    public static java.lang.String EXTRA_PACKAGE_NAME;
    public static java.lang.String EXTRA_PERMISSION_NAME;
    public static java.lang.String EXTRA_PHONE_NUMBER;
    public static java.lang.String EXTRA_PROCESS_TEXT;
    public static java.lang.String EXTRA_PROCESS_TEXT_READONLY;
    public static java.lang.String EXTRA_QUICK_VIEW_ADVANCED;
    public static java.lang.String EXTRA_QUICK_VIEW_FEATURES;
    public static java.lang.String EXTRA_QUIET_MODE;
    public static java.lang.String EXTRA_REASON;
    public static java.lang.String EXTRA_REFERRER;
    public static java.lang.String EXTRA_REFERRER_NAME;
    public static java.lang.String EXTRA_REMOTE_CALLBACK;
    public static java.lang.String EXTRA_REMOTE_INTENT_TOKEN;
    public static java.lang.String EXTRA_REMOVED_FOR_ALL_USERS;
    public static java.lang.String EXTRA_REPLACEMENT_EXTRAS;
    public static java.lang.String EXTRA_REPLACING;
    public static java.lang.String EXTRA_RESTRICTIONS_BUNDLE;
    public static java.lang.String EXTRA_RESTRICTIONS_INTENT;
    public static java.lang.String EXTRA_RESTRICTIONS_LIST;
    public static java.lang.String EXTRA_RESULT_NEEDED;
    public static java.lang.String EXTRA_RESULT_RECEIVER;
    public static java.lang.String EXTRA_RETURN_RESULT;
    public static java.lang.String EXTRA_SETTING_NAME;
    public static java.lang.String EXTRA_SETTING_NEW_VALUE;
    public static java.lang.String EXTRA_SETTING_PREVIOUS_VALUE;
    public static java.lang.String EXTRA_SETTING_RESTORED_FROM_SDK_INT;
    public static java.lang.String EXTRA_SHORTCUT_ICON;
    public static java.lang.String EXTRA_SHORTCUT_ICON_RESOURCE;
    public static java.lang.String EXTRA_SHORTCUT_INTENT;
    public static java.lang.String EXTRA_SHORTCUT_NAME;
    public static java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY;
    public static java.lang.String EXTRA_SIM_ACTIVATION_RESPONSE;
    public static java.lang.String EXTRA_SPLIT_NAME;
    public static java.lang.String EXTRA_STREAM;
    public static java.lang.String EXTRA_SUBJECT;
    public static java.lang.String EXTRA_SUSPENDED_PACKAGE_EXTRAS;
    public static java.lang.String EXTRA_SYSTEM_ID;
    public static java.lang.String EXTRA_TASK_ID;
    public static java.lang.String EXTRA_TEMPLATE;
    public static java.lang.String EXTRA_TEXT;
    public static java.lang.String EXTRA_THERMAL_STATE;
    public static int EXTRA_THERMAL_STATE_EXCEEDED;
    public static int EXTRA_THERMAL_STATE_NORMAL;
    public static int EXTRA_THERMAL_STATE_WARNING;
    public static java.lang.String EXTRA_TIME_PREF_24_HOUR_FORMAT;
    public static int EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
    public static int EXTRA_TIME_PREF_VALUE_USE_24_HOUR;
    public static int EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT;
    public static java.lang.String EXTRA_TITLE;
    public static java.lang.String EXTRA_UID;
    public static java.lang.String EXTRA_UNINSTALL_ALL_USERS;
    public static java.lang.String EXTRA_UNKNOWN_INSTANT_APP;
    public static java.lang.String EXTRA_USER;
    public static java.lang.String EXTRA_USER_HANDLE;
    public static java.lang.String EXTRA_USER_ID;
    public static java.lang.String EXTRA_USER_REQUESTED_SHUTDOWN;
    public static java.lang.String EXTRA_VERIFICATION_BUNDLE;
    public static java.lang.String EXTRA_VERSION_CODE;
    public static java.lang.String EXTRA_VOICE_RADIO_TECH;
    public static java.lang.String EXTRA_VOICE_REG_STATE;
    public static java.lang.String EXTRA_VOICE_ROAMING_TYPE;
    public static java.lang.String EXTRA_WIPE_ESIMS;
    public static java.lang.String EXTRA_WIPE_EXTERNAL_STORAGE;
    public static int FILL_IN_ACTION;
    public static int FILL_IN_CATEGORIES;
    public static int FILL_IN_CLIP_DATA;
    public static int FILL_IN_COMPONENT;
    public static int FILL_IN_DATA;
    public static int FILL_IN_PACKAGE;
    public static int FILL_IN_SELECTOR;
    public static int FILL_IN_SOURCE_BOUNDS;
    public static int FLAG_ACTIVITY_BROUGHT_TO_FRONT;
    public static int FLAG_ACTIVITY_CLEAR_TASK;
    public static int FLAG_ACTIVITY_CLEAR_TOP;
    public static int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
    public static int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
    public static int FLAG_ACTIVITY_FORWARD_RESULT;
    public static int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;
    public static int FLAG_ACTIVITY_LAUNCH_ADJACENT;
    public static int FLAG_ACTIVITY_MATCH_EXTERNAL;
    public static int FLAG_ACTIVITY_MULTIPLE_TASK;
    public static int FLAG_ACTIVITY_NEW_DOCUMENT;
    public static int FLAG_ACTIVITY_NEW_TASK;
    public static int FLAG_ACTIVITY_NO_ANIMATION;
    public static int FLAG_ACTIVITY_NO_HISTORY;
    public static int FLAG_ACTIVITY_NO_USER_ACTION;
    public static int FLAG_ACTIVITY_PREVIOUS_IS_TOP;
    public static int FLAG_ACTIVITY_REORDER_TO_FRONT;
    public static int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
    public static int FLAG_ACTIVITY_RETAIN_IN_RECENTS;
    public static int FLAG_ACTIVITY_SINGLE_TOP;
    public static int FLAG_ACTIVITY_TASK_ON_HOME;
    public static int FLAG_DEBUG_LOG_RESOLUTION;
    public static int FLAG_DEBUG_TRIAGED_MISSING;
    public static int FLAG_EXCLUDE_STOPPED_PACKAGES;
    public static int FLAG_FROM_BACKGROUND;
    public static int FLAG_GRANT_PERSISTABLE_URI_PERMISSION;
    public static int FLAG_GRANT_PREFIX_URI_PERMISSION;
    public static int FLAG_GRANT_READ_URI_PERMISSION;
    public static int FLAG_GRANT_WRITE_URI_PERMISSION;
    public static int FLAG_IGNORE_EPHEMERAL;
    public static int FLAG_INCLUDE_STOPPED_PACKAGES;
    public static int FLAG_RECEIVER_BOOT_UPGRADE;
    public static int FLAG_RECEIVER_EXCLUDE_BACKGROUND;
    public static int FLAG_RECEIVER_FOREGROUND;
    public static int FLAG_RECEIVER_FROM_SHELL;
    public static int FLAG_RECEIVER_INCLUDE_BACKGROUND;
    public static int FLAG_RECEIVER_NO_ABORT;
    public static int FLAG_RECEIVER_REGISTERED_ONLY;
    public static int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT;
    public static int FLAG_RECEIVER_REPLACE_PENDING;
    public static int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS;
    public static int IMMUTABLE_FLAGS;
    public static java.lang.String METADATA_DOCK_HOME;
    public static java.lang.String METADATA_SETUP_VERSION;
    public static int URI_ALLOW_UNSAFE;
    public static int URI_ANDROID_APP_SCHEME;
    public static int URI_INTENT_SCHEME;
}

-keep class android.content.Intent$CommandOptionHandler {

    public abstract boolean handleOption(java.lang.String, android.os.ShellCommand);


}

-keep class android.content.IntentFilter {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(android.content.IntentFilter);
    <init>(android.os.Parcel);

    public java.util.Iterator actionsIterator();
    public void addAction(java.lang.String);
    public void addCategory(java.lang.String);
    public void addDataAuthority(java.lang.String, java.lang.String);
    public void addDataAuthority(android.content.IntentFilter$AuthorityEntry);
    public void addDataPath(java.lang.String, int);
    public void addDataPath(android.os.PatternMatcher);
    public void addDataScheme(java.lang.String);
    public void addDataSchemeSpecificPart(java.lang.String, int);
    public void addDataSchemeSpecificPart(android.os.PatternMatcher);
    public void addDataType(java.lang.String);
    public java.util.Iterator authoritiesIterator();
    public java.util.Iterator categoriesIterator();
    public int countActions();
    public int countCategories();
    public int countDataAuthorities();
    public int countDataPaths();
    public int countDataSchemeSpecificParts();
    public int countDataSchemes();
    public int countDataTypes();
    public static android.content.IntentFilter create(java.lang.String, java.lang.String);
    public boolean debugCheck();
    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.String getAction(int);
    public boolean getAutoVerify();
    public java.lang.String getCategory(int);
    public android.content.IntentFilter$AuthorityEntry getDataAuthority(int);
    public android.os.PatternMatcher getDataPath(int);
    public java.lang.String getDataScheme(int);
    public android.os.PatternMatcher getDataSchemeSpecificPart(int);
    public java.lang.String getDataType(int);
    public java.lang.String[] getHosts();
    public java.util.ArrayList getHostsList();
    public int getOrder();
    public int getPriority();
    public int getVisibilityToInstantApp();
    public boolean handleAllWebDataURI();
    public boolean handlesWebUris(boolean);
    public boolean hasAction(java.lang.String);
    public boolean hasCategory(java.lang.String);
    public boolean hasDataAuthority(android.net.Uri);
    public boolean hasDataAuthority(android.content.IntentFilter$AuthorityEntry);
    public boolean hasDataPath(java.lang.String);
    public boolean hasDataPath(android.os.PatternMatcher);
    public boolean hasDataScheme(java.lang.String);
    public boolean hasDataSchemeSpecificPart(java.lang.String);
    public boolean hasDataSchemeSpecificPart(android.os.PatternMatcher);
    public boolean hasDataType(java.lang.String);
    public boolean hasExactDataType(java.lang.String);
    public boolean isExplicitlyVisibleToInstantApp();
    public boolean isImplicitlyVisibleToInstantApp();
    public boolean isVerified();
    public boolean isVisibleToInstantApp();
    public int match(android.content.ContentResolver, android.content.Intent, boolean, java.lang.String);
    public int match(java.lang.String, java.lang.String, java.lang.String, android.net.Uri, java.util.Set, java.lang.String);
    public boolean matchAction(java.lang.String);
    public java.lang.String matchCategories(java.util.Set);
    public int matchData(java.lang.String, java.lang.String, android.net.Uri);
    public int matchDataAuthority(android.net.Uri);
    public boolean needsVerification();
    public java.util.Iterator pathsIterator();
    public void readFromXml(org.xmlpull.v1.XmlPullParser);
    public java.util.Iterator schemeSpecificPartsIterator();
    public java.util.Iterator schemesIterator();
    public void setAutoVerify(boolean);
    public void setOrder(int);
    public void setPriority(int);
    public void setVerified(boolean);
    public void setVisibilityToInstantApp(int);
    public java.util.Iterator typesIterator();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public void writeToXml(org.xmlpull.v1.XmlSerializer);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MATCH_ADJUSTMENT_MASK;
    public static int MATCH_ADJUSTMENT_NORMAL;
    public static int MATCH_CATEGORY_EMPTY;
    public static int MATCH_CATEGORY_HOST;
    public static int MATCH_CATEGORY_MASK;
    public static int MATCH_CATEGORY_PATH;
    public static int MATCH_CATEGORY_PORT;
    public static int MATCH_CATEGORY_SCHEME;
    public static int MATCH_CATEGORY_SCHEME_SPECIFIC_PART;
    public static int MATCH_CATEGORY_TYPE;
    public static int NO_MATCH_ACTION;
    public static int NO_MATCH_CATEGORY;
    public static int NO_MATCH_DATA;
    public static int NO_MATCH_TYPE;
    public static java.lang.String SCHEME_HTTP;
    public static java.lang.String SCHEME_HTTPS;
    public static int SYSTEM_HIGH_PRIORITY;
    public static int SYSTEM_LOW_PRIORITY;
    public static int VISIBILITY_EXPLICIT;
    public static int VISIBILITY_IMPLICIT;
    public static int VISIBILITY_NONE;
}

-keep class android.content.IntentFilter$AuthorityEntry {
    <init>(java.lang.String, java.lang.String);

    public boolean equals(java.lang.Object);
    public java.lang.String getHost();
    public int getPort();
    public boolean match(android.content.IntentFilter$AuthorityEntry);
    public int match(android.net.Uri);


}

-keep class android.content.IntentFilter$MalformedMimeTypeException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.IntentSender {
    <init>(android.content.IIntentSender);
    <init>(android.content.IIntentSender, android.os.IBinder);
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getCreatorPackage();
    public int getCreatorUid();
    public android.os.UserHandle getCreatorUserHandle();
    public android.content.IIntentSender getTarget();
    public java.lang.String getTargetPackage();
    public android.os.IBinder getWhitelistToken();
    public int hashCode();
    public static android.content.IntentSender readIntentSenderOrNullFromParcel(android.os.Parcel);
    public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler);
    public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler, java.lang.String);
    public java.lang.String toString();
    public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.IntentSender$OnFinished {

    public abstract void onSendFinished(android.content.IntentSender, android.content.Intent, int, java.lang.String, android.os.Bundle);


}

-keep class android.content.IntentSender$SendIntentException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.Exception);



}

-keep class android.content.Loader {
    <init>(android.content.Context);

    public void abandon();
    public boolean cancelLoad();
    public void commitContentChanged();
    public java.lang.String dataToString(java.lang.Object);
    public void deliverCancellation();
    public void deliverResult(java.lang.Object);
    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void forceLoad();
    public android.content.Context getContext();
    public int getId();
    public boolean isAbandoned();
    public boolean isReset();
    public boolean isStarted();
    protected void onAbandon();
    protected boolean onCancelLoad();
    public void onContentChanged();
    protected void onForceLoad();
    protected void onReset();
    protected void onStartLoading();
    protected void onStopLoading();
    public void registerListener(int, android.content.Loader$OnLoadCompleteListener);
    public void registerOnLoadCanceledListener(android.content.Loader$OnLoadCanceledListener);
    public void reset();
    public void rollbackContentChanged();
    public void startLoading();
    public void stopLoading();
    public boolean takeContentChanged();
    public java.lang.String toString();
    public void unregisterListener(android.content.Loader$OnLoadCompleteListener);
    public void unregisterOnLoadCanceledListener(android.content.Loader$OnLoadCanceledListener);


}

-keep class android.content.Loader$OnLoadCanceledListener {

    public abstract void onLoadCanceled(android.content.Loader);


}

-keep class android.content.Loader$OnLoadCompleteListener {

    public abstract void onLoadComplete(android.content.Loader, java.lang.Object);


}

-keep class android.content.OperationApplicationException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(int);
    <init>(java.lang.String, int);

    public int getNumSuccessfulYieldPoints();


}

-keep class android.content.PeriodicSync {
    <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long);
    <init>(android.content.PeriodicSync);
    <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long, long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static boolean syncExtrasEquals(android.os.Bundle, android.os.Bundle);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.accounts.Account account;
    public java.lang.String authority;
    public android.os.Bundle extras;
    public long flexTime;
    public long period;
}

-keep class android.content.ServiceConnection {

    public void onBindingDied(android.content.ComponentName);
    public void onNullBinding(android.content.ComponentName);
    public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
    public abstract void onServiceDisconnected(android.content.ComponentName);


}

-keep class android.content.SharedPreferences {

    public abstract boolean contains(java.lang.String);
    public abstract android.content.SharedPreferences$Editor edit();
    public abstract java.util.Map getAll();
    public abstract boolean getBoolean(java.lang.String, boolean);
    public abstract float getFloat(java.lang.String, float);
    public abstract int getInt(java.lang.String, int);
    public abstract long getLong(java.lang.String, long);
    public abstract java.lang.String getString(java.lang.String, java.lang.String);
    public abstract java.util.Set getStringSet(java.lang.String, java.util.Set);
    public abstract void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);
    public abstract void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);


}

-keep class android.content.SharedPreferences$Editor {

    public abstract void apply();
    public abstract android.content.SharedPreferences$Editor clear();
    public abstract boolean commit();
    public abstract android.content.SharedPreferences$Editor putBoolean(java.lang.String, boolean);
    public abstract android.content.SharedPreferences$Editor putFloat(java.lang.String, float);
    public abstract android.content.SharedPreferences$Editor putInt(java.lang.String, int);
    public abstract android.content.SharedPreferences$Editor putLong(java.lang.String, long);
    public abstract android.content.SharedPreferences$Editor putString(java.lang.String, java.lang.String);
    public abstract android.content.SharedPreferences$Editor putStringSet(java.lang.String, java.util.Set);
    public abstract android.content.SharedPreferences$Editor remove(java.lang.String);


}

-keep class android.content.SharedPreferences$OnSharedPreferenceChangeListener {

    public abstract void onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String);


}

-keep class android.content.SyncAdapterType {
    <init>(java.lang.String, java.lang.String, boolean, boolean);
    <init>(java.lang.String, java.lang.String, boolean, boolean, boolean, boolean, java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public boolean allowParallelSyncs();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getPackageName();
    public java.lang.String getSettingsActivity();
    public int hashCode();
    public boolean isAlwaysSyncable();
    public boolean isUserVisible();
    public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
    public boolean supportsUploading();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String accountType;
    public java.lang.String authority;
    public boolean isKey;
}

-keep class android.content.SyncInfo {
    <init>(int, android.accounts.Account, java.lang.String, long);
    <init>(android.content.SyncInfo);

    public static android.content.SyncInfo createAccountRedacted(int, java.lang.String, long);
    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.accounts.Account account;
    public java.lang.String authority;
    public int authorityId;
    public long startTime;
}

-keep class android.content.SyncRequest {
    <init>(android.content.SyncRequest$Builder);

    public int describeContents();
    public android.accounts.Account getAccount();
    public android.os.Bundle getBundle();
    public java.lang.String getProvider();
    public long getSyncFlexTime();
    public long getSyncRunTime();
    public boolean isExpedited();
    public boolean isPeriodic();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.SyncRequest$Builder {
    <init>();

    public android.content.SyncRequest build();
    public android.content.SyncRequest$Builder setDisallowMetered(boolean);
    public android.content.SyncRequest$Builder setExpedited(boolean);
    public android.content.SyncRequest$Builder setExtras(android.os.Bundle);
    public android.content.SyncRequest$Builder setIgnoreBackoff(boolean);
    public android.content.SyncRequest$Builder setIgnoreSettings(boolean);
    public android.content.SyncRequest$Builder setManual(boolean);
    public android.content.SyncRequest$Builder setNoRetry(boolean);
    public android.content.SyncRequest$Builder setRequiresCharging(boolean);
    public android.content.SyncRequest$Builder setSyncAdapter(android.accounts.Account, java.lang.String);
    public android.content.SyncRequest$Builder syncOnce();
    public android.content.SyncRequest$Builder syncPeriodic(long, long);


}

-keep class android.content.SyncStatusInfo {
    <init>(int);
    <init>(android.os.Parcel);
    <init>(android.content.SyncStatusInfo);

    public void addEvent(java.lang.String);
    public int describeContents();
    public java.lang.String getEvent(int);
    public int getEventCount();
    public long getEventTime(int);
    public int getLastFailureMesgAsInt(int);
    public long getPeriodicSyncTime(int);
    public void maybeResetTodayStats(boolean, boolean);
    public void removePeriodicSyncTime(int);
    public void setLastFailure(int, long, java.lang.String);
    public void setLastSuccess(int, long);
    public void setPeriodicSyncTime(int, long);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int authorityId;
    public long initialFailureTime;
    public boolean initialize;
    public java.lang.String lastFailureMesg;
    public int lastFailureSource;
    public long lastFailureTime;
    public int lastSuccessSource;
    public long lastSuccessTime;
    public long lastTodayResetTime;
    public boolean pending;
    public long[] perSourceLastFailureTimes;
    public long[] perSourceLastSuccessTimes;
    public android.content.SyncStatusInfo$Stats todayStats;
    public android.content.SyncStatusInfo$Stats totalStats;
    public android.content.SyncStatusInfo$Stats yesterdayStats;
}

-keep class android.content.SyncStatusInfo$Stats {
    <init>();

    public void clear();
    public void copyTo(android.content.SyncStatusInfo$Stats);
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel);


    public int numCancels;
    public int numFailures;
    public int numSourceFeed;
    public int numSourceLocal;
    public int numSourceOther;
    public int numSourcePeriodic;
    public int numSourcePoll;
    public int numSourceUser;
    public int numSyncs;
    public long totalElapsedTime;
}

-keep class android.content.SyncStatusObserver {

    public abstract void onStatusChanged(int);


}

-keep class android.content.UriPermission {
    <init>(android.net.Uri, int, long);
    <init>(android.os.Parcel);

    public int describeContents();
    public long getPersistedTime();
    public android.net.Uri getUri();
    public boolean isReadPermission();
    public boolean isWritePermission();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static long INVALID_TIME;
}

-keep class android.content.pm.ActivityInfo {
    <init>();
    <init>(android.content.pm.ActivityInfo);

    public static int activityInfoConfigJavaToNative(int);
    public static int activityInfoConfigNativeToJava(int);
    public static java.lang.String colorModeToString(int);
    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, int);
    public int getRealConfigChanged();
    public int getThemeResource();
    public static boolean isFixedOrientationLandscape(int);
    public static boolean isFixedOrientationPortrait(int);
    public static boolean isPreserveOrientationMode(int);
    public static boolean isResizeableMode(int);
    public static boolean isTranslucentOrFloating(android.content.res.TypedArray);
    public static java.lang.String lockTaskLaunchModeToString(int);
    public static java.lang.String resizeModeToString(int);
    public static java.lang.String screenOrientationToString(int);
    public boolean supportsPictureInPicture();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int COLOR_MODE_DEFAULT;
    public static int COLOR_MODE_HDR;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT;
    public static int CONFIG_ASSETS_PATHS;
    public static int CONFIG_COLOR_MODE;
    public static int CONFIG_DENSITY;
    public static int CONFIG_FONT_SCALE;
    public static int CONFIG_KEYBOARD;
    public static int CONFIG_KEYBOARD_HIDDEN;
    public static int CONFIG_LAYOUT_DIRECTION;
    public static int CONFIG_LOCALE;
    public static int CONFIG_MCC;
    public static int CONFIG_MNC;
    public static int[] CONFIG_NATIVE_BITS;
    public static int CONFIG_NAVIGATION;
    public static int CONFIG_ORIENTATION;
    public static int CONFIG_SCREEN_LAYOUT;
    public static int CONFIG_SCREEN_SIZE;
    public static int CONFIG_SMALLEST_SCREEN_SIZE;
    public static int CONFIG_TOUCHSCREEN;
    public static int CONFIG_UI_MODE;
    public static int CONFIG_WINDOW_CONFIGURATION;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DOCUMENT_LAUNCH_ALWAYS;
    public static int DOCUMENT_LAUNCH_INTO_EXISTING;
    public static int DOCUMENT_LAUNCH_NEVER;
    public static int DOCUMENT_LAUNCH_NONE;
    public static int FLAG_ALLOW_EMBEDDED;
    public static int FLAG_ALLOW_TASK_REPARENTING;
    public static int FLAG_ALWAYS_FOCUSABLE;
    public static int FLAG_ALWAYS_RETAIN_TASK_STATE;
    public static int FLAG_AUTO_REMOVE_FROM_RECENTS;
    public static int FLAG_CLEAR_TASK_ON_LAUNCH;
    public static int FLAG_ENABLE_VR_MODE;
    public static int FLAG_EXCLUDE_FROM_RECENTS;
    public static int FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
    public static int FLAG_FINISH_ON_TASK_LAUNCH;
    public static int FLAG_HARDWARE_ACCELERATED;
    public static int FLAG_IMMERSIVE;
    public static int FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
    public static int FLAG_MULTIPROCESS;
    public static int FLAG_NO_HISTORY;
    public static int FLAG_RELINQUISH_TASK_IDENTITY;
    public static int FLAG_RESUME_WHILE_PAUSING;
    public static int FLAG_SHOW_FOR_ALL_USERS;
    public static int FLAG_SHOW_WHEN_LOCKED;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_STATE_NOT_NEEDED;
    public static int FLAG_SUPPORTS_PICTURE_IN_PICTURE;
    public static int FLAG_SYSTEM_USER_ONLY;
    public static int FLAG_TURN_SCREEN_ON;
    public static int FLAG_VISIBLE_TO_INSTANT_APP;
    public static int LAUNCH_MULTIPLE;
    public static int LAUNCH_SINGLE_INSTANCE;
    public static int LAUNCH_SINGLE_TASK;
    public static int LAUNCH_SINGLE_TOP;
    public static int LOCK_TASK_LAUNCH_MODE_ALWAYS;
    public static int LOCK_TASK_LAUNCH_MODE_DEFAULT;
    public static int LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED;
    public static int LOCK_TASK_LAUNCH_MODE_NEVER;
    public static int PERSIST_ACROSS_REBOOTS;
    public static int PERSIST_NEVER;
    public static int PERSIST_ROOT_ONLY;
    public static int RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY;
    public static int RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY;
    public static int RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION;
    public static int RESIZE_MODE_FORCE_RESIZEABLE;
    public static int RESIZE_MODE_RESIZEABLE;
    public static int RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED;
    public static int RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
    public static int RESIZE_MODE_UNRESIZEABLE;
    public static int SCREEN_ORIENTATION_BEHIND;
    public static int SCREEN_ORIENTATION_FULL_SENSOR;
    public static int SCREEN_ORIENTATION_FULL_USER;
    public static int SCREEN_ORIENTATION_LANDSCAPE;
    public static int SCREEN_ORIENTATION_LOCKED;
    public static int SCREEN_ORIENTATION_NOSENSOR;
    public static int SCREEN_ORIENTATION_PORTRAIT;
    public static int SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
    public static int SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    public static int SCREEN_ORIENTATION_SENSOR;
    public static int SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
    public static int SCREEN_ORIENTATION_SENSOR_PORTRAIT;
    public static int SCREEN_ORIENTATION_UNSET;
    public static int SCREEN_ORIENTATION_UNSPECIFIED;
    public static int SCREEN_ORIENTATION_USER;
    public static int SCREEN_ORIENTATION_USER_LANDSCAPE;
    public static int SCREEN_ORIENTATION_USER_PORTRAIT;
    public static int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW;
    public int colorMode;
    public int configChanges;
    public int documentLaunchMode;
    public int flags;
    public int launchMode;
    public java.lang.String launchToken;
    public int lockTaskLaunchMode;
    public float maxAspectRatio;
    public int maxRecents;
    public java.lang.String parentActivityName;
    public java.lang.String permission;
    public int persistableMode;
    public java.lang.String requestedVrComponent;
    public int resizeMode;
    public int rotationAnimation;
    public int screenOrientation;
    public int softInputMode;
    public java.lang.String targetActivity;
    public java.lang.String taskAffinity;
    public int theme;
    public int uiOptions;
    public android.content.pm.ActivityInfo$WindowLayout windowLayout;
}

-keep class android.content.pm.ActivityInfo$WindowLayout {
    <init>(int, float, int, float, int, int, int);



    public int gravity;
    public int height;
    public float heightFraction;
    public int minHeight;
    public int minWidth;
    public int width;
    public float widthFraction;
}

-keep class android.content.pm.ApplicationInfo {
    <init>();
    <init>(android.content.pm.ApplicationInfo);

    public int describeContents();
    public void disableCompatibilityMode();
    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, int);
    protected android.content.pm.ApplicationInfo getApplicationInfo();
    public java.lang.String getBaseCodePath();
    public java.lang.String getBaseResourcePath();
    public static java.lang.CharSequence getCategoryTitle(android.content.Context, int);
    public java.lang.String getCodePath();
    public int getHiddenApiEnforcementPolicy();
    public java.lang.String getResourcePath();
    public java.lang.String[] getSplitCodePaths();
    public java.lang.String[] getSplitResourcePaths();
    public boolean hasCode();
    public boolean hasRtlSupport();
    public void initForUser(int);
    public boolean isDefaultToDeviceProtectedStorage();
    public boolean isDirectBootAware();
    public boolean isEncryptionAware();
    public boolean isExternal();
    public boolean isExternalAsec();
    public boolean isForwardLocked();
    public boolean isInstantApp();
    public boolean isInternal();
    public boolean isOem();
    public boolean isPartiallyDirectBootAware();
    public boolean isPrivilegedApp();
    public boolean isProduct();
    public boolean isRequiredForSystemUser();
    public boolean isSignedWithPlatformKey();
    public boolean isStaticSharedLibrary();
    public boolean isSystemApp();
    public boolean isUpdatedSystemApp();
    public static boolean isValidHiddenApiEnforcementPolicy(int);
    public boolean isVendor();
    public boolean isVirtualPreload();
    public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public void maybeUpdateHiddenApiEnforcementPolicy(int, int);
    public boolean requestsIsolatedSplitLoading();
    public void setBaseCodePath(java.lang.String);
    public void setBaseResourcePath(java.lang.String);
    public void setCodePath(java.lang.String);
    public void setHiddenApiEnforcementPolicy(int);
    public void setResourcePath(java.lang.String);
    public void setSplitCodePaths(java.lang.String[]);
    public void setSplitResourcePaths(java.lang.String[]);
    public void setVersionCode(long);
    public java.lang.String toString();
    public boolean usesCompatibilityMode();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long, int);


    public static int CATEGORY_AUDIO;
    public static int CATEGORY_GAME;
    public static int CATEGORY_IMAGE;
    public static int CATEGORY_MAPS;
    public static int CATEGORY_NEWS;
    public static int CATEGORY_PRODUCTIVITY;
    public static int CATEGORY_SOCIAL;
    public static int CATEGORY_UNDEFINED;
    public static int CATEGORY_VIDEO;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_ALLOW_BACKUP;
    public static int FLAG_ALLOW_CLEAR_USER_DATA;
    public static int FLAG_ALLOW_TASK_REPARENTING;
    public static int FLAG_DEBUGGABLE;
    public static int FLAG_EXTERNAL_STORAGE;
    public static int FLAG_EXTRACT_NATIVE_LIBS;
    public static int FLAG_FACTORY_TEST;
    public static int FLAG_FULL_BACKUP_ONLY;
    public static int FLAG_HARDWARE_ACCELERATED;
    public static int FLAG_HAS_CODE;
    public static int FLAG_INSTALLED;
    public static int FLAG_IS_DATA_ONLY;
    public static int FLAG_IS_GAME;
    public static int FLAG_KILL_AFTER_RESTORE;
    public static int FLAG_LARGE_HEAP;
    public static int FLAG_MULTIARCH;
    public static int FLAG_PERSISTENT;
    public static int FLAG_RESIZEABLE_FOR_SCREENS;
    public static int FLAG_RESTORE_ANY_VERSION;
    public static int FLAG_STOPPED;
    public static int FLAG_SUPPORTS_LARGE_SCREENS;
    public static int FLAG_SUPPORTS_NORMAL_SCREENS;
    public static int FLAG_SUPPORTS_RTL;
    public static int FLAG_SUPPORTS_SCREEN_DENSITIES;
    public static int FLAG_SUPPORTS_SMALL_SCREENS;
    public static int FLAG_SUPPORTS_XLARGE_SCREENS;
    public static int FLAG_SUSPENDED;
    public static int FLAG_SYSTEM;
    public static int FLAG_TEST_ONLY;
    public static int FLAG_UPDATED_SYSTEM_APP;
    public static int FLAG_USES_CLEARTEXT_TRAFFIC;
    public static int FLAG_VM_SAFE_MODE;
    public static int HIDDEN_API_ENFORCEMENT_BLACK;
    public static int HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
    public static int HIDDEN_API_ENFORCEMENT_DEFAULT;
    public static int HIDDEN_API_ENFORCEMENT_JUST_WARN;
    public static int HIDDEN_API_ENFORCEMENT_NONE;
    public static java.lang.String METADATA_PRELOADED_FONTS;
    public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
    public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
    public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE;
    public static int PRIVATE_FLAG_BACKUP_IN_FOREGROUND;
    public static int PRIVATE_FLAG_CANT_SAVE_STATE;
    public static int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
    public static int PRIVATE_FLAG_DIRECT_BOOT_AWARE;
    public static int PRIVATE_FLAG_FORWARD_LOCK;
    public static int PRIVATE_FLAG_HAS_DOMAIN_URLS;
    public static int PRIVATE_FLAG_HIDDEN;
    public static int PRIVATE_FLAG_INSTANT;
    public static int PRIVATE_FLAG_ISOLATED_SPLIT_LOADING;
    public static int PRIVATE_FLAG_OEM;
    public static int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE;
    public static int PRIVATE_FLAG_PRIVILEGED;
    public static int PRIVATE_FLAG_PRODUCT;
    public static int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
    public static int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;
    public static int PRIVATE_FLAG_STATIC_SHARED_LIBRARY;
    public static int PRIVATE_FLAG_VENDOR;
    public static int PRIVATE_FLAG_VIRTUAL_PRELOAD;
    public java.lang.String appComponentFactory;
    public java.lang.String backupAgentName;
    public int category;
    public java.lang.String classLoaderName;
    public java.lang.String className;
    public int compatibleWidthLimitDp;
    public int compileSdkVersion;
    public java.lang.String compileSdkVersionCodename;
    public java.lang.String credentialProtectedDataDir;
    public java.lang.String dataDir;
    public int descriptionRes;
    public java.lang.String deviceProtectedDataDir;
    public boolean enabled;
    public int enabledSetting;
    public int flags;
    public int fullBackupContent;
    public boolean hiddenUntilInstalled;
    public int installLocation;
    public int largestWidthLimitDp;
    public long longVersionCode;
    public java.lang.String manageSpaceActivityName;
    public float maxAspectRatio;
    public int minSdkVersion;
    public java.lang.String nativeLibraryDir;
    public java.lang.String nativeLibraryRootDir;
    public boolean nativeLibraryRootRequiresIsa;
    public int networkSecurityConfigRes;
    public java.lang.String permission;
    public java.lang.String primaryCpuAbi;
    public int privateFlags;
    public java.lang.String processName;
    public java.lang.String publicSourceDir;
    public int requiresSmallestWidthDp;
    public java.lang.String[] resourceDirs;
    public java.lang.String scanPublicSourceDir;
    public java.lang.String scanSourceDir;
    public java.lang.String seInfo;
    public java.lang.String seInfoUser;
    public java.lang.String secondaryCpuAbi;
    public java.lang.String secondaryNativeLibraryDir;
    public java.lang.String[] sharedLibraryFiles;
    public java.lang.String sourceDir;
    public java.lang.String[] splitClassLoaderNames;
    public android.util.SparseArray splitDependencies;
    public java.lang.String[] splitNames;
    public java.lang.String[] splitPublicSourceDirs;
    public java.lang.String[] splitSourceDirs;
    public java.util.UUID storageUuid;
    public int targetSandboxVersion;
    public int targetSdkVersion;
    public java.lang.String taskAffinity;
    public int theme;
    public int uiOptions;
    public int uid;
    public int versionCode;
    public java.lang.String volumeUuid;
}

-keep class android.content.pm.AuxiliaryResolveInfo {
    <init>(java.lang.String, boolean, android.content.Intent, java.util.List);
    <init>(android.content.ComponentName, android.content.Intent, java.util.List);
    <init>(android.content.ComponentName, java.lang.String, long, java.lang.String);



    public android.content.Intent failureIntent;
    public java.util.List filters;
    public android.content.ComponentName installFailureActivity;
    public boolean needsPhaseTwo;
    public java.lang.String token;
}

-keep class android.content.pm.AuxiliaryResolveInfo$AuxiliaryFilter {
    <init>(android.content.IntentFilter, android.content.pm.InstantAppResolveInfo, java.lang.String, android.os.Bundle);
    <init>(android.content.pm.InstantAppResolveInfo, java.lang.String, android.os.Bundle);
    <init>(java.lang.String, long, java.lang.String);

    public java.lang.String toString();


    public android.os.Bundle extras;
    public java.lang.String packageName;
    public android.content.pm.InstantAppResolveInfo resolveInfo;
    public java.lang.String splitName;
    public long versionCode;
}

-keep class android.content.pm.BaseParceledListSlice {
    <init>(java.util.List);

    public java.util.List getList();
    protected abstract android.os.Parcelable$Creator readParcelableCreator(android.os.Parcel, java.lang.ClassLoader);
    public void setInlineCountLimit(int);
    protected abstract void writeElement(java.lang.Object, android.os.Parcel, int);
    protected abstract void writeParcelableCreator(java.lang.Object, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


}

-keep class android.content.pm.ChangedPackages {
    <init>(int, java.util.List);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.util.List getPackageNames();
    public int getSequenceNumber();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.ComponentInfo {
    <init>();
    <init>(android.content.pm.ComponentInfo);
    <init>(android.os.Parcel);

    protected void dumpBack(android.util.Printer, java.lang.String);
    protected void dumpFront(android.util.Printer, java.lang.String);
    protected android.content.pm.ApplicationInfo getApplicationInfo();
    public int getBannerResource();
    public android.content.ComponentName getComponentName();
    public int getIconResource();
    public int getLogoResource();
    public boolean isEnabled();
    protected android.graphics.drawable.Drawable loadDefaultBanner(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
    protected android.graphics.drawable.Drawable loadDefaultLogo(android.content.pm.PackageManager);
    public java.lang.CharSequence loadUnsafeLabel(android.content.pm.PackageManager);
    public void writeToParcel(android.os.Parcel, int);


    public android.content.pm.ApplicationInfo applicationInfo;
    public int descriptionRes;
    public boolean directBootAware;
    public boolean enabled;
    public boolean encryptionAware;
    public boolean exported;
    public java.lang.String processName;
    public java.lang.String splitName;
}

-keep class android.content.pm.ConfigurationInfo {
    <init>();
    <init>(android.content.pm.ConfigurationInfo);

    public int describeContents();
    public java.lang.String getGlEsVersion();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int GL_ES_VERSION_UNDEFINED;
    public static int INPUT_FEATURE_FIVE_WAY_NAV;
    public static int INPUT_FEATURE_HARD_KEYBOARD;
    public int reqGlEsVersion;
    public int reqInputFeatures;
    public int reqKeyboardType;
    public int reqNavigation;
    public int reqTouchScreen;
}

-keep class android.content.pm.FeatureGroupInfo {
    <init>();
    <init>(android.content.pm.FeatureGroupInfo);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.FeatureInfo[] features;
}

-keep class android.content.pm.FeatureInfo {
    <init>();
    <init>(android.content.pm.FeatureInfo);

    public int describeContents();
    public java.lang.String getGlEsVersion();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_REQUIRED;
    public static int GL_ES_VERSION_UNDEFINED;
    public int flags;
    public java.lang.String name;
    public int reqGlEsVersion;
    public int version;
}

-keep class android.content.pm.IDexModuleRegisterCallback {

    public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);


}

-keep class android.content.pm.IOnPermissionsChangeListener {

    public abstract void onPermissionsChanged(int);


}

-keep class android.content.pm.IPackageDataObserver {

    public abstract void onRemoveCompleted(java.lang.String, boolean);


}

-keep class android.content.pm.IPackageDeleteObserver {

    public abstract void packageDeleted(java.lang.String, int);


}

-keep class android.content.pm.IPackageDeleteObserver2 {

    public abstract void onPackageDeleted(java.lang.String, int, java.lang.String);
    public abstract void onUserActionRequired(android.content.Intent);


}

-keep class android.content.pm.IPackageInstaller {

    public abstract void abandonSession(int);
    public abstract int createSession(android.content.pm.PackageInstaller$SessionParams, java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getAllSessions(int);
    public abstract android.content.pm.ParceledListSlice getMySessions(java.lang.String, int);
    public abstract android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
    public abstract android.content.pm.IPackageInstallerSession openSession(int);
    public abstract void registerCallback(android.content.pm.IPackageInstallerCallback, int);
    public abstract void setPermissionsResult(int, boolean);
    public abstract void uninstall(android.content.pm.VersionedPackage, java.lang.String, int, android.content.IntentSender, int);
    public abstract void unregisterCallback(android.content.pm.IPackageInstallerCallback);
    public abstract void updateSessionAppIcon(int, android.graphics.Bitmap);
    public abstract void updateSessionAppLabel(int, java.lang.String);


}

-keep class android.content.pm.IPackageInstallerCallback {

    public abstract void onSessionActiveChanged(int, boolean);
    public abstract void onSessionBadgingChanged(int);
    public abstract void onSessionCreated(int);
    public abstract void onSessionFinished(int, boolean);
    public abstract void onSessionProgressChanged(int, float);


}

-keep class android.content.pm.IPackageInstallerSession {

    public abstract void abandon();
    public abstract void addClientProgress(float);
    public abstract void close();
    public abstract void commit(android.content.IntentSender, boolean);
    public abstract java.lang.String[] getNames();
    public abstract android.os.ParcelFileDescriptor openRead(java.lang.String);
    public abstract android.os.ParcelFileDescriptor openWrite(java.lang.String, long, long);
    public abstract void removeSplit(java.lang.String);
    public abstract void setClientProgress(float);
    public abstract void transfer(java.lang.String);
    public abstract void write(java.lang.String, long, long, android.os.ParcelFileDescriptor);


}

-keep class android.content.pm.IPackageManager {

    public abstract boolean activitySupportsIntent(android.content.ComponentName, android.content.Intent, java.lang.String);
    public abstract void addCrossProfileIntentFilter(android.content.IntentFilter, java.lang.String, int, int, int);
    public abstract void addOnPermissionsChangeListener(android.content.pm.IOnPermissionsChangeListener);
    public abstract boolean addPermission(android.content.pm.PermissionInfo);
    public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
    public abstract void addPersistentPreferredActivity(android.content.IntentFilter, android.content.ComponentName, int);
    public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public abstract boolean canForwardTo(android.content.Intent, java.lang.String, int, int);
    public abstract boolean canRequestPackageInstalls(java.lang.String, int);
    public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
    public abstract void checkPackageStartable(java.lang.String, int);
    public abstract int checkPermission(java.lang.String, java.lang.String, int);
    public abstract int checkSignatures(java.lang.String, java.lang.String);
    public abstract int checkUidPermission(java.lang.String, int);
    public abstract int checkUidSignatures(int, int);
    public abstract void clearApplicationProfileData(java.lang.String);
    public abstract void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver, int);
    public abstract void clearCrossProfileIntentFilters(int, java.lang.String);
    public abstract void clearPackagePersistentPreferredActivities(java.lang.String, int);
    public abstract void clearPackagePreferredActivities(java.lang.String);
    public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
    public abstract void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
    public abstract void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
    public abstract void deletePackageAsUser(java.lang.String, int, android.content.pm.IPackageDeleteObserver, int, int);
    public abstract void deletePackageVersioned(android.content.pm.VersionedPackage, android.content.pm.IPackageDeleteObserver2, int, int);
    public abstract void deletePreloadsFileCache();
    public abstract void dumpProfiles(java.lang.String);
    public abstract void enterSafeMode();
    public abstract void extendVerificationTimeout(int, int, long);
    public abstract android.content.pm.ResolveInfo findPersistentPreferredActivity(android.content.Intent, int);
    public abstract void finishPackageInstall(int, boolean);
    public abstract void flushPackageRestrictionsAsUser(int);
    public abstract void forceDexOpt(java.lang.String);
    public abstract void freeStorage(java.lang.String, long, int, android.content.IntentSender);
    public abstract void freeStorageAndNotify(java.lang.String, long, int, android.content.pm.IPackageDataObserver);
    public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int, int);
    public abstract android.content.pm.ParceledListSlice getAllIntentFilters(java.lang.String);
    public abstract java.util.List getAllPackages();
    public abstract android.content.pm.ParceledListSlice getAllPermissionGroups(int);
    public abstract java.lang.String[] getAppOpPermissionPackages(java.lang.String);
    public abstract int getApplicationEnabledSetting(java.lang.String, int);
    public abstract boolean getApplicationHiddenSettingAsUser(java.lang.String, int);
    public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int, int);
    public abstract android.content.pm.dex.IArtManager getArtManager();
    public abstract boolean getBlockUninstallForUser(java.lang.String, int);
    public abstract android.content.pm.ChangedPackages getChangedPackages(int, int);
    public abstract int getComponentEnabledSetting(android.content.ComponentName, int);
    public abstract byte[] getDefaultAppsBackup(int);
    public abstract java.lang.String getDefaultBrowserPackageName(int);
    public abstract int getFlagsForUid(int);
    public abstract java.lang.CharSequence getHarmfulAppWarning(java.lang.String, int);
    public abstract android.content.ComponentName getHomeActivities(java.util.List);
    public abstract int getInstallLocation();
    public abstract int getInstallReason(java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getInstalledApplications(int, int);
    public abstract android.content.pm.ParceledListSlice getInstalledPackages(int, int);
    public abstract java.lang.String getInstallerPackageName(java.lang.String);
    public abstract java.lang.String getInstantAppAndroidId(java.lang.String, int);
    public abstract byte[] getInstantAppCookie(java.lang.String, int);
    public abstract android.graphics.Bitmap getInstantAppIcon(java.lang.String, int);
    public abstract android.content.ComponentName getInstantAppInstallerComponent();
    public abstract android.content.ComponentName getInstantAppResolverComponent();
    public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
    public abstract android.content.pm.ParceledListSlice getInstantApps(int);
    public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
    public abstract byte[] getIntentFilterVerificationBackup(int);
    public abstract android.content.pm.ParceledListSlice getIntentFilterVerifications(java.lang.String);
    public abstract int getIntentVerificationStatus(java.lang.String, int);
    public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
    public abstract android.content.pm.ResolveInfo getLastChosenActivity(android.content.Intent, java.lang.String, int);
    public abstract int getMoveStatus(int);
    public abstract java.lang.String getNameForUid(int);
    public abstract java.lang.String[] getNamesForUids(int[]);
    public abstract int[] getPackageGids(java.lang.String, int, int);
    public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int, int);
    public abstract android.content.pm.PackageInfo getPackageInfoVersioned(android.content.pm.VersionedPackage, int, int);
    public abstract android.content.pm.IPackageInstaller getPackageInstaller();
    public abstract void getPackageSizeInfo(java.lang.String, int, android.content.pm.IPackageStatsObserver);
    public abstract int getPackageUid(java.lang.String, int, int);
    public abstract java.lang.String[] getPackagesForUid(int);
    public abstract android.content.pm.ParceledListSlice getPackagesHoldingPermissions(java.lang.String[], int, int);
    public abstract java.lang.String getPermissionControllerPackageName();
    public abstract int getPermissionFlags(java.lang.String, java.lang.String, int);
    public abstract byte[] getPermissionGrantBackup(int);
    public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
    public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getPersistentApplications(int);
    public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
    public abstract byte[] getPreferredActivityBackup(int);
    public abstract int getPrivateFlagsForUid(int);
    public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int, int);
    public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int, int);
    public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int, int);
    public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
    public abstract android.content.pm.ParceledListSlice getSharedLibraries(java.lang.String, int, int);
    public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
    public abstract android.content.pm.KeySet getSigningKeySet(java.lang.String);
    public abstract android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice getSystemAvailableFeatures();
    public abstract java.lang.String[] getSystemSharedLibraryNames();
    public abstract java.lang.String getSystemTextClassifierPackageName();
    public abstract int getUidForSharedUser(java.lang.String);
    public abstract android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
    public abstract void grantDefaultPermissionsToActiveLuiApp(java.lang.String, int);
    public abstract void grantDefaultPermissionsToEnabledCarrierApps(java.lang.String[], int);
    public abstract void grantDefaultPermissionsToEnabledImsServices(java.lang.String[], int);
    public abstract void grantDefaultPermissionsToEnabledTelephonyDataServices(java.lang.String[], int);
    public abstract void grantRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean hasSigningCertificate(java.lang.String, byte[], int);
    public abstract boolean hasSystemFeature(java.lang.String, int);
    public abstract boolean hasSystemUidErrors();
    public abstract boolean hasUidSigningCertificate(int, byte[], int);
    public abstract int installExistingPackageAsUser(java.lang.String, int, int, int);
    public abstract boolean isFirstBoot();
    public abstract boolean isInstantApp(java.lang.String, int);
    public abstract boolean isOnlyCoreApps();
    public abstract boolean isPackageAvailable(java.lang.String, int);
    public abstract boolean isPackageDeviceAdminOnAnyUser(java.lang.String);
    public abstract boolean isPackageSignedByKeySet(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isPackageSignedByKeySetExactly(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isPackageStateProtected(java.lang.String, int);
    public abstract boolean isPackageSuspendedForUser(java.lang.String, int);
    public abstract boolean isPermissionEnforced(java.lang.String);
    public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String, int);
    public abstract boolean isProtectedBroadcast(java.lang.String);
    public abstract boolean isSafeMode();
    public abstract boolean isStorageLow();
    public abstract boolean isUidPrivileged(int);
    public abstract boolean isUpgrade();
    public abstract void logAppProcessStartIfNeeded(java.lang.String, int, java.lang.String, java.lang.String, int);
    public abstract int movePackage(java.lang.String, java.lang.String);
    public abstract int movePrimaryStorage(java.lang.String);
    public abstract android.content.pm.PackageCleanItem nextPackageToClean(android.content.pm.PackageCleanItem);
    public abstract void notifyDexLoad(java.lang.String, java.util.List, java.util.List, java.lang.String);
    public abstract void notifyPackageUse(java.lang.String, int);
    public abstract boolean performDexOptMode(java.lang.String, boolean, java.lang.String, boolean, boolean, java.lang.String);
    public abstract boolean performDexOptSecondary(java.lang.String, java.lang.String, boolean);
    public abstract void performFstrimIfNeeded();
    public abstract android.content.pm.ParceledListSlice queryContentProviders(java.lang.String, int, int, java.lang.String);
    public abstract android.content.pm.ParceledListSlice queryInstrumentation(java.lang.String, int);
    public abstract android.content.pm.ParceledListSlice queryIntentActivities(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], java.lang.String[], android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentContentProviders(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentReceivers(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryIntentServices(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ParceledListSlice queryPermissionsByGroup(java.lang.String, int);
    public abstract void querySyncProviders(java.util.List, java.util.List);
    public abstract void reconcileSecondaryDexFiles(java.lang.String);
    public abstract void registerDexModule(java.lang.String, java.lang.String, boolean, android.content.pm.IDexModuleRegisterCallback);
    public abstract void registerMoveCallback(android.content.pm.IPackageMoveObserver);
    public abstract void removeOnPermissionsChangeListener(android.content.pm.IOnPermissionsChangeListener);
    public abstract void removePermission(java.lang.String);
    public abstract void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public abstract void resetApplicationPreferences(int);
    public abstract void resetRuntimePermissions();
    public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int, int);
    public abstract android.content.pm.ResolveInfo resolveIntent(android.content.Intent, java.lang.String, int, int);
    public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, java.lang.String, int, int);
    public abstract void restoreDefaultApps(byte[], int);
    public abstract void restoreIntentFilterVerification(byte[], int);
    public abstract void restorePermissionGrants(byte[], int);
    public abstract void restorePreferredActivities(byte[], int);
    public abstract void revokeDefaultPermissionsFromDisabledTelephonyDataServices(java.lang.String[], int);
    public abstract void revokeDefaultPermissionsFromLuiApps(java.lang.String[], int);
    public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, int);
    public abstract boolean runBackgroundDexoptJob(java.util.List);
    public abstract void setApplicationCategoryHint(java.lang.String, int, java.lang.String);
    public abstract void setApplicationEnabledSetting(java.lang.String, int, int, int, java.lang.String);
    public abstract boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, int);
    public abstract boolean setBlockUninstallForUser(java.lang.String, boolean, int);
    public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int, int);
    public abstract boolean setDefaultBrowserPackageName(java.lang.String, int);
    public abstract void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence, int);
    public abstract void setHomeActivity(android.content.ComponentName, int);
    public abstract boolean setInstallLocation(int);
    public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
    public abstract boolean setInstantAppCookie(java.lang.String, byte[], int);
    public abstract void setLastChosenActivity(android.content.Intent, java.lang.String, int, android.content.IntentFilter, int, android.content.ComponentName);
    public abstract void setPackageStoppedState(java.lang.String, boolean, int);
    public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int);
    public abstract void setPermissionEnforced(java.lang.String, boolean);
    public abstract boolean setRequiredForSystemUser(java.lang.String, boolean);
    public abstract void setSystemAppHiddenUntilInstalled(java.lang.String, boolean);
    public abstract boolean setSystemAppInstallState(java.lang.String, boolean, int);
    public abstract void setUpdateAvailable(java.lang.String, boolean);
    public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int);
    public abstract void systemReady();
    public abstract void unregisterMoveCallback(android.content.pm.IPackageMoveObserver);
    public abstract boolean updateIntentVerificationStatus(java.lang.String, int, int);
    public abstract void updatePackagesIfNeeded();
    public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, int);
    public abstract void updatePermissionFlagsForAllApps(int, int, int);
    public abstract void verifyIntentFilter(int, int, java.util.List);
    public abstract void verifyPendingInstall(int, int);


}

-keep class android.content.pm.IPackageMoveObserver {

    public abstract void onCreated(int, android.os.Bundle);
    public abstract void onStatusChanged(int, int, long);


}

-keep class android.content.pm.IPackageStatsObserver {

    public abstract void onGetStatsCompleted(android.content.pm.PackageStats, boolean);


}

-keep class android.content.pm.InstantAppInfo {
    <init>(android.content.pm.ApplicationInfo, java.lang.String[], java.lang.String[]);
    <init>(java.lang.String, java.lang.CharSequence, java.lang.String[], java.lang.String[]);

    public int describeContents();
    public android.content.pm.ApplicationInfo getApplicationInfo();
    public java.lang.String[] getGrantedPermissions();
    public java.lang.String getPackageName();
    public java.lang.String[] getRequestedPermissions();
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.InstantAppIntentFilter {
    <init>(java.lang.String, java.util.List);

    public int describeContents();
    public java.util.List getFilters();
    public java.lang.String getSplitName();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.InstantAppResolveInfo {
    <init>(android.content.pm.InstantAppResolveInfo$InstantAppDigest, java.lang.String, java.util.List, int);
    <init>(android.content.pm.InstantAppResolveInfo$InstantAppDigest, java.lang.String, java.util.List, long, android.os.Bundle);
    <init>(java.lang.String, java.lang.String, java.util.List);
    <init>(android.os.Bundle);

    public int describeContents();
    public byte[] getDigestBytes();
    public int getDigestPrefix();
    public android.os.Bundle getExtras();
    public java.util.List getIntentFilters();
    public long getLongVersionCode();
    public java.lang.String getPackageName();
    public int getVersionCode();
    public boolean shouldLetInstallerDecide();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.InstantAppResolveInfo$InstantAppDigest {
    <init>(java.lang.String);
    <init>(java.lang.String, int);

    public int describeContents();
    public byte[][] getDigestBytes();
    public int[] getDigestPrefix();
    public int[] getDigestPrefixSecure();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.content.pm.InstantAppResolveInfo$InstantAppDigest UNDEFINED;
}

-keep class android.content.pm.InstrumentationInfo {
    <init>();
    <init>(android.content.pm.InstrumentationInfo);

    public void copyTo(android.content.pm.ApplicationInfo);
    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String credentialProtectedDataDir;
    public java.lang.String dataDir;
    public java.lang.String deviceProtectedDataDir;
    public boolean functionalTest;
    public boolean handleProfiling;
    public java.lang.String nativeLibraryDir;
    public java.lang.String primaryCpuAbi;
    public java.lang.String publicSourceDir;
    public java.lang.String secondaryCpuAbi;
    public java.lang.String secondaryNativeLibraryDir;
    public java.lang.String sourceDir;
    public android.util.SparseArray splitDependencies;
    public java.lang.String[] splitNames;
    public java.lang.String[] splitPublicSourceDirs;
    public java.lang.String[] splitSourceDirs;
    public java.lang.String targetPackage;
    public java.lang.String targetProcesses;
}

-keep class android.content.pm.IntentFilterVerificationInfo {
    <init>();
    <init>(java.lang.String, android.util.ArraySet);
    <init>(org.xmlpull.v1.XmlPullParser);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.util.Set getDomains();
    public java.lang.String getDomainsString();
    public java.lang.String getPackageName();
    public int getStatus();
    public java.lang.String getStatusString();
    public static java.lang.String getStatusStringFromValue(long);
    public void readFromXml(org.xmlpull.v1.XmlPullParser);
    public void setDomains(android.util.ArraySet);
    public void setStatus(int);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToXml(org.xmlpull.v1.XmlSerializer);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.KeySet {
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.os.IBinder getToken();
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.PackageCleanItem {
    <init>(int, java.lang.String, boolean);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public boolean andCode;
    public java.lang.String packageName;
    public int userId;
}

-keep class android.content.pm.PackageInfo {
    <init>();

    public static long composeLongVersionCode(int, int);
    public int describeContents();
    public long getLongVersionCode();
    public boolean isOverlayPackage();
    public boolean isStaticOverlayPackage();
    public void setLongVersionCode(long);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int INSTALL_LOCATION_AUTO;
    public static int INSTALL_LOCATION_INTERNAL_ONLY;
    public static int INSTALL_LOCATION_PREFER_EXTERNAL;
    public static int INSTALL_LOCATION_UNSPECIFIED;
    public static int REQUESTED_PERMISSION_GRANTED;
    public static int REQUESTED_PERMISSION_REQUIRED;
    public android.content.pm.ActivityInfo[] activities;
    public android.content.pm.ApplicationInfo applicationInfo;
    public int baseRevisionCode;
    public int compileSdkVersion;
    public java.lang.String compileSdkVersionCodename;
    public android.content.pm.ConfigurationInfo[] configPreferences;
    public boolean coreApp;
    public android.content.pm.FeatureGroupInfo[] featureGroups;
    public long firstInstallTime;
    public int[] gids;
    public int installLocation;
    public android.content.pm.InstrumentationInfo[] instrumentation;
    public boolean isStub;
    public long lastUpdateTime;
    public java.lang.String overlayCategory;
    public int overlayPriority;
    public java.lang.String overlayTarget;
    public java.lang.String packageName;
    public android.content.pm.PermissionInfo[] permissions;
    public android.content.pm.ProviderInfo[] providers;
    public android.content.pm.ActivityInfo[] receivers;
    public android.content.pm.FeatureInfo[] reqFeatures;
    public java.lang.String[] requestedPermissions;
    public int[] requestedPermissionsFlags;
    public java.lang.String requiredAccountType;
    public boolean requiredForAllUsers;
    public java.lang.String restrictedAccountType;
    public android.content.pm.ServiceInfo[] services;
    public java.lang.String sharedUserId;
    public int sharedUserLabel;
    public android.content.pm.Signature[] signatures;
    public android.content.pm.SigningInfo signingInfo;
    public java.lang.String[] splitNames;
    public int[] splitRevisionCodes;
    public int versionCode;
    public int versionCodeMajor;
    public java.lang.String versionName;
}

-keep class android.content.pm.PackageInstaller {
    <init>(android.content.pm.IPackageInstaller, java.lang.String, int);

    public void abandonSession(int);
    public void addSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void addSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
    public int createSession(android.content.pm.PackageInstaller$SessionParams);
    public java.util.List getAllSessions();
    public java.util.List getMySessions();
    public android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
    public android.content.pm.PackageInstaller$Session openSession(int);
    public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
    public void removeSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void setPermissionsResult(int, boolean);
    public void uninstall(java.lang.String, android.content.IntentSender);
    public void uninstall(java.lang.String, int, android.content.IntentSender);
    public void uninstall(android.content.pm.VersionedPackage, android.content.IntentSender);
    public void uninstall(android.content.pm.VersionedPackage, int, android.content.IntentSender);
    public void unregisterSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
    public void updateSessionAppIcon(int, android.graphics.Bitmap);
    public void updateSessionAppLabel(int, java.lang.CharSequence);


    public static java.lang.String ACTION_CONFIRM_PERMISSIONS;
    public static java.lang.String ACTION_SESSION_COMMITTED;
    public static java.lang.String ACTION_SESSION_DETAILS;
    public static boolean ENABLE_REVOCABLE_FD;
    public static java.lang.String EXTRA_CALLBACK;
    public static java.lang.String EXTRA_LEGACY_BUNDLE;
    public static java.lang.String EXTRA_LEGACY_STATUS;
    public static java.lang.String EXTRA_OTHER_PACKAGE_NAME;
    public static java.lang.String EXTRA_PACKAGE_NAME;
    public static java.lang.String EXTRA_PACKAGE_NAMES;
    public static java.lang.String EXTRA_SESSION;
    public static java.lang.String EXTRA_SESSION_ID;
    public static java.lang.String EXTRA_STATUS;
    public static java.lang.String EXTRA_STATUS_MESSAGE;
    public static java.lang.String EXTRA_STORAGE_PATH;
    public static int STATUS_FAILURE;
    public static int STATUS_FAILURE_ABORTED;
    public static int STATUS_FAILURE_BLOCKED;
    public static int STATUS_FAILURE_CONFLICT;
    public static int STATUS_FAILURE_INCOMPATIBLE;
    public static int STATUS_FAILURE_INVALID;
    public static int STATUS_FAILURE_STORAGE;
    public static int STATUS_PENDING_USER_ACTION;
    public static int STATUS_SUCCESS;
}

-keep class android.content.pm.PackageInstaller$Session {
    <init>(android.content.pm.IPackageInstallerSession);

    public void abandon();
    public void addProgress(float);
    public void close();
    public void commit(android.content.IntentSender);
    public void commitTransferred(android.content.IntentSender);
    public void fsync(java.io.OutputStream);
    public java.lang.String[] getNames();
    public java.io.InputStream openRead(java.lang.String);
    public java.io.OutputStream openWrite(java.lang.String, long, long);
    public void removeSplit(java.lang.String);
    public void setProgress(float);
    public void setStagingProgress(float);
    public void transfer(java.lang.String);
    public void write(java.lang.String, long, long, android.os.ParcelFileDescriptor);


}

-keep class android.content.pm.PackageInstaller$SessionCallback {
    <init>();

    public abstract void onActiveChanged(int, boolean);
    public abstract void onBadgingChanged(int);
    public abstract void onCreated(int);
    public abstract void onFinished(int, boolean);
    public abstract void onProgressChanged(int, float);


}

-keep class android.content.pm.PackageInstaller$SessionInfo {
    <init>();
    <init>(android.os.Parcel);

    public android.content.Intent createDetailsIntent();
    public int describeContents();
    public boolean getAllocateAggressive();
    public boolean getAllowDowngrade();
    public android.graphics.Bitmap getAppIcon();
    public java.lang.CharSequence getAppLabel();
    public java.lang.String getAppPackageName();
    public android.content.Intent getDetailsIntent();
    public boolean getDontKillApp();
    public java.lang.String[] getGrantedRuntimePermissions();
    public boolean getInstallAsFullApp(boolean);
    public boolean getInstallAsInstantApp(boolean);
    public boolean getInstallAsVirtualPreload();
    public int getInstallLocation();
    public int getInstallReason();
    public java.lang.String getInstallerPackageName();
    public int getMode();
    public int getOriginatingUid();
    public android.net.Uri getOriginatingUri();
    public float getProgress();
    public android.net.Uri getReferrerUri();
    public int getSessionId();
    public long getSize();
    public boolean isActive();
    public boolean isOpen();
    public boolean isSealed();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public boolean active;
    public android.graphics.Bitmap appIcon;
    public java.lang.CharSequence appLabel;
    public java.lang.String appPackageName;
    public java.lang.String[] grantedRuntimePermissions;
    public int installFlags;
    public int installLocation;
    public int installReason;
    public java.lang.String installerPackageName;
    public int mode;
    public int originatingUid;
    public android.net.Uri originatingUri;
    public float progress;
    public android.net.Uri referrerUri;
    public java.lang.String resolvedBaseCodePath;
    public boolean sealed;
    public int sessionId;
    public long sizeBytes;
}

-keep class android.content.pm.PackageInstaller$SessionParams {
    <init>(int);
    <init>(android.os.Parcel);

    public boolean areHiddenOptionsSet();
    public int describeContents();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public void setAllocateAggressive(boolean);
    public void setAllowDowngrade(boolean);
    public void setAppIcon(android.graphics.Bitmap);
    public void setAppLabel(java.lang.CharSequence);
    public void setAppPackageName(java.lang.String);
    public void setDontKillApp(boolean);
    public void setGrantedRuntimePermissions(java.lang.String[]);
    public void setInstallAsInstantApp(boolean);
    public void setInstallAsVirtualPreload();
    public void setInstallFlagsExternal();
    public void setInstallFlagsForcePermissionPrompt();
    public void setInstallFlagsInternal();
    public void setInstallLocation(int);
    public void setInstallReason(int);
    public void setInstallerPackageName(java.lang.String);
    public void setOriginatingUid(int);
    public void setOriginatingUri(android.net.Uri);
    public void setReferrerUri(android.net.Uri);
    public void setSize(long);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MODE_FULL_INSTALL;
    public static int MODE_INHERIT_EXISTING;
    public static int MODE_INVALID;
    public static int UID_UNKNOWN;
    public java.lang.String abiOverride;
    public android.graphics.Bitmap appIcon;
    public long appIconLastModified;
    public java.lang.String appLabel;
    public java.lang.String appPackageName;
    public java.lang.String[] grantedRuntimePermissions;
    public int installFlags;
    public int installLocation;
    public int installReason;
    public java.lang.String installerPackageName;
    public int mode;
    public int originatingUid;
    public android.net.Uri originatingUri;
    public android.net.Uri referrerUri;
    public long sizeBytes;
    public java.lang.String volumeUuid;
}

-keep class android.content.pm.PackageItemInfo {
    <init>();
    <init>(android.content.pm.PackageItemInfo);
    <init>(android.os.Parcel);

    protected void dumpBack(android.util.Printer, java.lang.String);
    protected void dumpFront(android.util.Printer, java.lang.String);
    protected android.content.pm.ApplicationInfo getApplicationInfo();
    public android.graphics.drawable.Drawable loadBanner(android.content.pm.PackageManager);
    protected android.graphics.drawable.Drawable loadDefaultBanner(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
    protected android.graphics.drawable.Drawable loadDefaultLogo(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public android.graphics.drawable.Drawable loadLogo(android.content.pm.PackageManager);
    public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager);
    public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager, float, int);
    public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadUnsafeLabel(android.content.pm.PackageManager);
    public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String);
    public static void setForceSafeLabels(boolean);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int DUMP_FLAG_ALL;
    public static int DUMP_FLAG_APPLICATION;
    public static int DUMP_FLAG_DETAILS;
    public static int SAFE_LABEL_FLAG_FIRST_LINE;
    public static int SAFE_LABEL_FLAG_SINGLE_LINE;
    public static int SAFE_LABEL_FLAG_TRIM;
    public int banner;
    public int icon;
    public int labelRes;
    public int logo;
    public android.os.Bundle metaData;
    public java.lang.String name;
    public java.lang.CharSequence nonLocalizedLabel;
    public java.lang.String packageName;
    public int showUserIcon;
}

-keep class android.content.pm.PackageManager {
    <init>();

    public abstract void addCrossProfileIntentFilter(android.content.IntentFilter, int, int, int);
    public abstract void addOnPermissionsChangeListener(android.content.pm.PackageManager$OnPermissionsChangedListener);
    public abstract void addPackageToPreferred(java.lang.String);
    public abstract boolean addPermission(android.content.pm.PermissionInfo);
    public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
    public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
    public void addPreferredActivityAsUser(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public android.content.Intent buildRequestPermissionsIntent(java.lang.String[]);
    public abstract boolean canRequestPackageInstalls();
    public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
    public abstract int checkPermission(java.lang.String, java.lang.String);
    public abstract int checkSignatures(java.lang.String, java.lang.String);
    public abstract int checkSignatures(int, int);
    public abstract void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
    public abstract void clearCrossProfileIntentFilters(int);
    public abstract void clearInstantAppCookie();
    public abstract void clearPackagePreferredActivities(java.lang.String);
    public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
    public abstract void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
    public abstract void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
    public abstract void deletePackage(java.lang.String, android.content.pm.IPackageDeleteObserver, int);
    public abstract void deletePackageAsUser(java.lang.String, android.content.pm.IPackageDeleteObserver, int, int);
    public static int deleteStatusToPublicStatus(int);
    public static java.lang.String deleteStatusToString(int, java.lang.String);
    public static java.lang.String deleteStatusToString(int);
    public abstract void extendVerificationTimeout(int, int, long);
    public abstract void flushPackageRestrictionsAsUser(int);
    public void freeStorage(long, android.content.IntentSender);
    public abstract void freeStorage(java.lang.String, long, android.content.IntentSender);
    public void freeStorageAndNotify(long, android.content.pm.IPackageDataObserver);
    public abstract void freeStorageAndNotify(java.lang.String, long, android.content.pm.IPackageDataObserver);
    public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.Intent);
    public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.Intent);
    public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int);
    public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.Intent);
    public abstract java.util.List getAllIntentFilters(java.lang.String);
    public abstract java.util.List getAllPermissionGroups(int);
    public abstract android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationBanner(java.lang.String);
    public abstract int getApplicationEnabledSetting(java.lang.String);
    public abstract boolean getApplicationHiddenSettingAsUser(java.lang.String, android.os.UserHandle);
    public abstract android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationIcon(java.lang.String);
    public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int);
    public abstract android.content.pm.ApplicationInfo getApplicationInfoAsUser(java.lang.String, int, int);
    public abstract java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable getApplicationLogo(java.lang.String);
    public android.content.pm.dex.ArtManager getArtManager();
    public abstract android.content.Intent getCarLaunchIntentForPackage(java.lang.String);
    public abstract android.content.pm.ChangedPackages getChangedPackages(int);
    public abstract int getComponentEnabledSetting(android.content.ComponentName);
    public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
    public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
    public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
    public java.lang.CharSequence getHarmfulAppWarning(java.lang.String);
    public abstract android.content.ComponentName getHomeActivities(java.util.List);
    public abstract int getInstallReason(java.lang.String, android.os.UserHandle);
    public abstract java.util.List getInstalledApplications(int);
    public abstract java.util.List getInstalledApplicationsAsUser(int, int);
    public abstract java.util.List getInstalledPackages(int);
    public abstract java.util.List getInstalledPackagesAsUser(int, int);
    public abstract java.lang.String getInstallerPackageName(java.lang.String);
    public abstract java.lang.String getInstantAppAndroidId(java.lang.String, android.os.UserHandle);
    public abstract byte[] getInstantAppCookie();
    public abstract int getInstantAppCookieMaxBytes();
    public abstract int getInstantAppCookieMaxSize();
    public abstract android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String);
    public abstract android.content.ComponentName getInstantAppInstallerComponent();
    public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
    public abstract java.util.List getInstantApps();
    public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
    public abstract java.util.List getIntentFilterVerifications(java.lang.String);
    public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
    public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
    public abstract android.content.Intent getLaunchIntentForPackage(java.lang.String);
    public abstract android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
    public abstract int getMoveStatus(int);
    public abstract java.lang.String getNameForUid(int);
    public abstract java.lang.String[] getNamesForUids(int[]);
    public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
    public abstract java.util.List getPackageCandidateVolumes(android.content.pm.ApplicationInfo);
    public abstract android.os.storage.VolumeInfo getPackageCurrentVolume(android.content.pm.ApplicationInfo);
    public abstract int[] getPackageGids(java.lang.String);
    public abstract int[] getPackageGids(java.lang.String, int);
    public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int);
    public abstract android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int);
    public abstract android.content.pm.PackageInfo getPackageInfoAsUser(java.lang.String, int, int);
    public abstract android.content.pm.PackageInstaller getPackageInstaller();
    public void getPackageSizeInfo(java.lang.String, android.content.pm.IPackageStatsObserver);
    public abstract void getPackageSizeInfoAsUser(java.lang.String, int, android.content.pm.IPackageStatsObserver);
    public abstract int getPackageUid(java.lang.String, int);
    public abstract int getPackageUidAsUser(java.lang.String, int);
    public abstract int getPackageUidAsUser(java.lang.String, int, int);
    public abstract java.lang.String[] getPackagesForUid(int);
    public abstract java.util.List getPackagesHoldingPermissions(java.lang.String[], int);
    public abstract java.lang.String getPermissionControllerPackageName();
    public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
    public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
    public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int);
    public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
    public abstract java.util.List getPreferredPackages(int);
    public abstract java.util.List getPrimaryStorageCandidateVolumes();
    public abstract android.os.storage.VolumeInfo getPrimaryStorageCurrentVolume();
    public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int);
    public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int);
    public abstract android.content.res.Resources getResourcesForActivity(android.content.ComponentName);
    public abstract android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
    public abstract android.content.res.Resources getResourcesForApplication(java.lang.String);
    public abstract android.content.res.Resources getResourcesForApplicationAsUser(java.lang.String, int);
    public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int);
    public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
    public abstract java.util.List getSharedLibraries(int);
    public abstract java.util.List getSharedLibrariesAsUser(int, int);
    public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
    public abstract android.content.pm.KeySet getSigningKeySet(java.lang.String);
    public android.os.Bundle getSuspendedPackageAppExtras();
    public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
    public abstract java.lang.String[] getSystemSharedLibraryNames();
    public java.lang.String getSystemTextClassifierPackageName();
    public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract int getUidForSharedUser(java.lang.String);
    public abstract android.graphics.drawable.Drawable getUserBadgeForDensity(android.os.UserHandle, int);
    public abstract android.graphics.drawable.Drawable getUserBadgeForDensityNoBackground(android.os.UserHandle, int);
    public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
    public abstract android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
    public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
    public int getUserId();
    public abstract android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
    public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
    public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public boolean hasSigningCertificate(java.lang.String, byte[], int);
    public boolean hasSigningCertificate(int, byte[], int);
    public abstract boolean hasSystemFeature(java.lang.String);
    public abstract boolean hasSystemFeature(java.lang.String, int);
    public abstract int installExistingPackage(java.lang.String);
    public abstract int installExistingPackage(java.lang.String, int);
    public abstract int installExistingPackageAsUser(java.lang.String, int);
    public static int installStatusToPublicStatus(int);
    public static java.lang.String installStatusToString(int, java.lang.String);
    public static java.lang.String installStatusToString(int);
    public abstract boolean isInstantApp();
    public abstract boolean isInstantApp(java.lang.String);
    public static boolean isMoveStatusFinished(int);
    public abstract boolean isPackageAvailable(java.lang.String);
    public boolean isPackageStateProtected(java.lang.String, int);
    public boolean isPackageSuspended(java.lang.String);
    public boolean isPackageSuspended();
    public abstract boolean isPackageSuspendedForUser(java.lang.String, int);
    public abstract boolean isPermissionReviewModeEnabled();
    public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
    public abstract boolean isSafeMode();
    public abstract boolean isSignedBy(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isSignedByExactly(java.lang.String, android.content.pm.KeySet);
    public abstract boolean isUpgrade();
    public abstract android.graphics.drawable.Drawable loadItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
    public abstract android.graphics.drawable.Drawable loadUnbadgedItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
    public abstract int movePackage(java.lang.String, android.os.storage.VolumeInfo);
    public abstract int movePrimaryStorage(android.os.storage.VolumeInfo);
    public static java.lang.String permissionFlagToString(int);
    public abstract java.util.List queryBroadcastReceivers(android.content.Intent, int);
    public java.util.List queryBroadcastReceivers(android.content.Intent, int, int);
    public java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
    public abstract java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryContentProviders(java.lang.String, int, int);
    public java.util.List queryContentProviders(java.lang.String, int, int, java.lang.String);
    public abstract java.util.List queryInstrumentation(java.lang.String, int);
    public abstract java.util.List queryIntentActivities(android.content.Intent, int);
    public abstract java.util.List queryIntentActivitiesAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
    public abstract java.util.List queryIntentContentProviders(android.content.Intent, int);
    public abstract java.util.List queryIntentContentProvidersAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryIntentServices(android.content.Intent, int);
    public abstract java.util.List queryIntentServicesAsUser(android.content.Intent, int, int);
    public abstract java.util.List queryPermissionsByGroup(java.lang.String, int);
    public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager$DexModuleRegisterCallback);
    public abstract void registerMoveCallback(android.content.pm.PackageManager$MoveCallback, android.os.Handler);
    public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager$OnPermissionsChangedListener);
    public abstract void removePackageFromPreferred(java.lang.String);
    public abstract void removePermission(java.lang.String);
    public abstract void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
    public void replacePreferredActivityAsUser(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
    public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
    public abstract android.content.pm.ResolveInfo resolveActivityAsUser(android.content.Intent, int, int);
    public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
    public abstract android.content.pm.ProviderInfo resolveContentProviderAsUser(java.lang.String, int, int);
    public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
    public abstract android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
    public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
    public abstract void setApplicationCategoryHint(java.lang.String, int);
    public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
    public abstract boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, android.os.UserHandle);
    public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
    public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
    public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
    public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
    public abstract boolean setInstantAppCookie(byte[]);
    public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
    public abstract void setUpdateAvailable(java.lang.String, boolean);
    public abstract boolean shouldShowRequestPermissionRationale(java.lang.String);
    public abstract void unregisterMoveCallback(android.content.pm.PackageManager$MoveCallback);
    public abstract void updateInstantAppCookie(byte[]);
    public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
    public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
    public abstract void verifyIntentFilter(int, int, java.util.List);
    public abstract void verifyPendingInstall(int, int);


    public static java.lang.String ACTION_CLEAN_EXTERNAL_STORAGE;
    public static java.lang.String ACTION_REQUEST_PERMISSIONS;
    public static boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
    public static int CERT_INPUT_RAW_X509;
    public static int CERT_INPUT_SHA256;
    public static int COMPONENT_ENABLED_STATE_DEFAULT;
    public static int COMPONENT_ENABLED_STATE_DISABLED;
    public static int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
    public static int COMPONENT_ENABLED_STATE_DISABLED_USER;
    public static int COMPONENT_ENABLED_STATE_ENABLED;
    public static int DELETE_ALL_USERS;
    public static int DELETE_CHATTY;
    public static int DELETE_DONT_KILL_APP;
    public static int DELETE_FAILED_ABORTED;
    public static int DELETE_FAILED_DEVICE_POLICY_MANAGER;
    public static int DELETE_FAILED_INTERNAL_ERROR;
    public static int DELETE_FAILED_OWNER_BLOCKED;
    public static int DELETE_FAILED_USED_SHARED_LIBRARY;
    public static int DELETE_FAILED_USER_RESTRICTED;
    public static int DELETE_KEEP_DATA;
    public static int DELETE_SUCCEEDED;
    public static int DELETE_SYSTEM_APP;
    public static int DONT_KILL_APP;
    public static java.lang.String EXTRA_FAILURE_EXISTING_PACKAGE;
    public static java.lang.String EXTRA_FAILURE_EXISTING_PERMISSION;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_HOSTS;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_ID;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME;
    public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME;
    public static java.lang.String EXTRA_MOVE_ID;
    public static java.lang.String EXTRA_REQUEST_PERMISSIONS_NAMES;
    public static java.lang.String EXTRA_REQUEST_PERMISSIONS_RESULTS;
    public static java.lang.String EXTRA_VERIFICATION_ID;
    public static java.lang.String EXTRA_VERIFICATION_INSTALLER_PACKAGE;
    public static java.lang.String EXTRA_VERIFICATION_INSTALLER_UID;
    public static java.lang.String EXTRA_VERIFICATION_INSTALL_FLAGS;
    public static java.lang.String EXTRA_VERIFICATION_LONG_VERSION_CODE;
    public static java.lang.String EXTRA_VERIFICATION_PACKAGE_NAME;
    public static java.lang.String EXTRA_VERIFICATION_RESULT;
    public static java.lang.String EXTRA_VERIFICATION_URI;
    public static java.lang.String EXTRA_VERIFICATION_VERSION_CODE;
    public static java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
    public static java.lang.String FEATURE_ADOPTABLE_STORAGE;
    public static java.lang.String FEATURE_APP_WIDGETS;
    public static java.lang.String FEATURE_ASSIST_GESTURE;
    public static java.lang.String FEATURE_AUDIO_LOW_LATENCY;
    public static java.lang.String FEATURE_AUDIO_OUTPUT;
    public static java.lang.String FEATURE_AUDIO_PRO;
    public static java.lang.String FEATURE_AUTOFILL;
    public static java.lang.String FEATURE_AUTOMOTIVE;
    public static java.lang.String FEATURE_BACKUP;
    public static java.lang.String FEATURE_BLUETOOTH;
    public static java.lang.String FEATURE_BLUETOOTH_LE;
    public static java.lang.String FEATURE_BROADCAST_RADIO;
    public static java.lang.String FEATURE_CAMERA;
    public static java.lang.String FEATURE_CAMERA_ANY;
    public static java.lang.String FEATURE_CAMERA_AR;
    public static java.lang.String FEATURE_CAMERA_AUTOFOCUS;
    public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING;
    public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR;
    public static java.lang.String FEATURE_CAMERA_CAPABILITY_RAW;
    public static java.lang.String FEATURE_CAMERA_EXTERNAL;
    public static java.lang.String FEATURE_CAMERA_FLASH;
    public static java.lang.String FEATURE_CAMERA_FRONT;
    public static java.lang.String FEATURE_CAMERA_LEVEL_FULL;
    public static java.lang.String FEATURE_CANT_SAVE_STATE;
    public static java.lang.String FEATURE_COMPANION_DEVICE_SETUP;
    public static java.lang.String FEATURE_CONNECTION_SERVICE;
    public static java.lang.String FEATURE_CONSUMER_IR;
    public static java.lang.String FEATURE_CTS;
    public static java.lang.String FEATURE_DEVICE_ADMIN;
    public static java.lang.String FEATURE_DEVICE_ID_ATTESTATION;
    public static java.lang.String FEATURE_EMBEDDED;
    public static java.lang.String FEATURE_ETHERNET;
    public static java.lang.String FEATURE_FAKETOUCH;
    public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT;
    public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND;
    public static java.lang.String FEATURE_FILE_BASED_ENCRYPTION;
    public static java.lang.String FEATURE_FINGERPRINT;
    public static java.lang.String FEATURE_FREEFORM_WINDOW_MANAGEMENT;
    public static java.lang.String FEATURE_GAMEPAD;
    public static java.lang.String FEATURE_HDMI_CEC;
    public static java.lang.String FEATURE_HIFI_SENSORS;
    public static java.lang.String FEATURE_HOME_SCREEN;
    public static java.lang.String FEATURE_INPUT_METHODS;
    public static java.lang.String FEATURE_LEANBACK;
    public static java.lang.String FEATURE_LEANBACK_ONLY;
    public static java.lang.String FEATURE_LIVE_TV;
    public static java.lang.String FEATURE_LIVE_WALLPAPER;
    public static java.lang.String FEATURE_LOCATION;
    public static java.lang.String FEATURE_LOCATION_GPS;
    public static java.lang.String FEATURE_LOCATION_NETWORK;
    public static java.lang.String FEATURE_LOWPAN;
    public static java.lang.String FEATURE_MANAGED_PROFILES;
    public static java.lang.String FEATURE_MANAGED_USERS;
    public static java.lang.String FEATURE_MICROPHONE;
    public static java.lang.String FEATURE_MIDI;
    public static java.lang.String FEATURE_NFC;
    public static java.lang.String FEATURE_NFC_ANY;
    public static java.lang.String FEATURE_NFC_HCE;
    public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION;
    public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF;
    public static java.lang.String FEATURE_OPENGLES_EXTENSION_PACK;
    public static java.lang.String FEATURE_PC;
    public static java.lang.String FEATURE_PICTURE_IN_PICTURE;
    public static java.lang.String FEATURE_PRINTING;
    public static java.lang.String FEATURE_RAM_LOW;
    public static java.lang.String FEATURE_RAM_NORMAL;
    public static java.lang.String FEATURE_SCREEN_LANDSCAPE;
    public static java.lang.String FEATURE_SCREEN_PORTRAIT;
    public static java.lang.String FEATURE_SECURELY_REMOVES_USERS;
    public static java.lang.String FEATURE_SENSOR_ACCELEROMETER;
    public static java.lang.String FEATURE_SENSOR_AMBIENT_TEMPERATURE;
    public static java.lang.String FEATURE_SENSOR_BAROMETER;
    public static java.lang.String FEATURE_SENSOR_COMPASS;
    public static java.lang.String FEATURE_SENSOR_GYROSCOPE;
    public static java.lang.String FEATURE_SENSOR_HEART_RATE;
    public static java.lang.String FEATURE_SENSOR_HEART_RATE_ECG;
    public static java.lang.String FEATURE_SENSOR_LIGHT;
    public static java.lang.String FEATURE_SENSOR_PROXIMITY;
    public static java.lang.String FEATURE_SENSOR_RELATIVE_HUMIDITY;
    public static java.lang.String FEATURE_SENSOR_STEP_COUNTER;
    public static java.lang.String FEATURE_SENSOR_STEP_DETECTOR;
    public static java.lang.String FEATURE_SIP;
    public static java.lang.String FEATURE_SIP_VOIP;
    public static java.lang.String FEATURE_STRONGBOX_KEYSTORE;
    public static java.lang.String FEATURE_TELEPHONY;
    public static java.lang.String FEATURE_TELEPHONY_CARRIERLOCK;
    public static java.lang.String FEATURE_TELEPHONY_CDMA;
    public static java.lang.String FEATURE_TELEPHONY_EUICC;
    public static java.lang.String FEATURE_TELEPHONY_GSM;
    public static java.lang.String FEATURE_TELEPHONY_MBMS;
    public static java.lang.String FEATURE_TELEVISION;
    public static java.lang.String FEATURE_TOUCHSCREEN;
    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH;
    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT;
    public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND;
    public static java.lang.String FEATURE_USB_ACCESSORY;
    public static java.lang.String FEATURE_USB_HOST;
    public static java.lang.String FEATURE_VERIFIED_BOOT;
    public static java.lang.String FEATURE_VOICE_RECOGNIZERS;
    public static java.lang.String FEATURE_VR_HEADTRACKING;
    public static java.lang.String FEATURE_VR_MODE;
    public static java.lang.String FEATURE_VR_MODE_HIGH_PERFORMANCE;
    public static java.lang.String FEATURE_VULKAN_HARDWARE_COMPUTE;
    public static java.lang.String FEATURE_VULKAN_HARDWARE_LEVEL;
    public static java.lang.String FEATURE_VULKAN_HARDWARE_VERSION;
    public static java.lang.String FEATURE_WATCH;
    public static java.lang.String FEATURE_WEBVIEW;
    public static java.lang.String FEATURE_WIFI;
    public static java.lang.String FEATURE_WIFI_AWARE;
    public static java.lang.String FEATURE_WIFI_DIRECT;
    public static java.lang.String FEATURE_WIFI_PASSPOINT;
    public static java.lang.String FEATURE_WIFI_RTT;
    public static int FLAG_PERMISSION_GRANTED_BY_DEFAULT;
    public static int FLAG_PERMISSION_POLICY_FIXED;
    public static int FLAG_PERMISSION_REVIEW_REQUIRED;
    public static int FLAG_PERMISSION_REVOKE_ON_UPGRADE;
    public static int FLAG_PERMISSION_SYSTEM_FIXED;
    public static int FLAG_PERMISSION_USER_FIXED;
    public static int FLAG_PERMISSION_USER_SET;
    public static int GET_ACTIVITIES;
    public static int GET_CONFIGURATIONS;
    public static int GET_DISABLED_COMPONENTS;
    public static int GET_DISABLED_UNTIL_USED_COMPONENTS;
    public static int GET_GIDS;
    public static int GET_INSTRUMENTATION;
    public static int GET_INTENT_FILTERS;
    public static int GET_META_DATA;
    public static int GET_PERMISSIONS;
    public static int GET_PROVIDERS;
    public static int GET_RECEIVERS;
    public static int GET_RESOLVED_FILTER;
    public static int GET_SERVICES;
    public static int GET_SHARED_LIBRARY_FILES;
    public static int GET_SIGNATURES;
    public static int GET_SIGNING_CERTIFICATES;
    public static int GET_UNINSTALLED_PACKAGES;
    public static int GET_URI_PERMISSION_PATTERNS;
    public static int INSTALL_ALLOCATE_AGGRESSIVE;
    public static int INSTALL_ALLOW_DOWNGRADE;
    public static int INSTALL_ALLOW_TEST;
    public static int INSTALL_ALL_USERS;
    public static int INSTALL_DONT_KILL_APP;
    public static int INSTALL_EXTERNAL;
    public static int INSTALL_FAILED_ABORTED;
    public static int INSTALL_FAILED_ALREADY_EXISTS;
    public static int INSTALL_FAILED_BAD_DEX_METADATA;
    public static int INSTALL_FAILED_CONFLICTING_PROVIDER;
    public static int INSTALL_FAILED_CONTAINER_ERROR;
    public static int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE;
    public static int INSTALL_FAILED_DEXOPT;
    public static int INSTALL_FAILED_DUPLICATE_PACKAGE;
    public static int INSTALL_FAILED_DUPLICATE_PERMISSION;
    public static int INSTALL_FAILED_INSTANT_APP_INVALID;
    public static int INSTALL_FAILED_INSUFFICIENT_STORAGE;
    public static int INSTALL_FAILED_INTERNAL_ERROR;
    public static int INSTALL_FAILED_INVALID_APK;
    public static int INSTALL_FAILED_INVALID_INSTALL_LOCATION;
    public static int INSTALL_FAILED_INVALID_URI;
    public static int INSTALL_FAILED_MEDIA_UNAVAILABLE;
    public static int INSTALL_FAILED_MISSING_FEATURE;
    public static int INSTALL_FAILED_MISSING_SHARED_LIBRARY;
    public static int INSTALL_FAILED_NEWER_SDK;
    public static int INSTALL_FAILED_NO_MATCHING_ABIS;
    public static int INSTALL_FAILED_NO_SHARED_USER;
    public static int INSTALL_FAILED_OLDER_SDK;
    public static int INSTALL_FAILED_PACKAGE_CHANGED;
    public static int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE;
    public static int INSTALL_FAILED_REPLACE_COULDNT_DELETE;
    public static int INSTALL_FAILED_SANDBOX_VERSION_DOWNGRADE;
    public static int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
    public static int INSTALL_FAILED_TEST_ONLY;
    public static int INSTALL_FAILED_UID_CHANGED;
    public static int INSTALL_FAILED_UPDATE_INCOMPATIBLE;
    public static int INSTALL_FAILED_USER_RESTRICTED;
    public static int INSTALL_FAILED_VERIFICATION_FAILURE;
    public static int INSTALL_FAILED_VERIFICATION_TIMEOUT;
    public static int INSTALL_FAILED_VERSION_DOWNGRADE;
    public static int INSTALL_FORCE_PERMISSION_PROMPT;
    public static int INSTALL_FORCE_SDK;
    public static int INSTALL_FORCE_VOLUME_UUID;
    public static int INSTALL_FORWARD_LOCK;
    public static int INSTALL_FROM_ADB;
    public static int INSTALL_FULL_APP;
    public static int INSTALL_GRANT_RUNTIME_PERMISSIONS;
    public static int INSTALL_INSTANT_APP;
    public static int INSTALL_INTERNAL;
    public static int INSTALL_PARSE_FAILED_BAD_MANIFEST;
    public static int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
    public static int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
    public static int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
    public static int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
    public static int INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
    public static int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
    public static int INSTALL_PARSE_FAILED_NOT_APK;
    public static int INSTALL_PARSE_FAILED_NO_CERTIFICATES;
    public static int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
    public static int INSTALL_REASON_DEVICE_RESTORE;
    public static int INSTALL_REASON_DEVICE_SETUP;
    public static int INSTALL_REASON_POLICY;
    public static int INSTALL_REASON_UNKNOWN;
    public static int INSTALL_REASON_USER;
    public static int INSTALL_REPLACE_EXISTING;
    public static int INSTALL_SUCCEEDED;
    public static int INSTALL_VIRTUAL_PRELOAD;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
    public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
    public static int INTENT_FILTER_VERIFICATION_FAILURE;
    public static int INTENT_FILTER_VERIFICATION_SUCCESS;
    public static int MASK_PERMISSION_FLAGS;
    public static int MATCH_ALL;
    public static int MATCH_ANY_USER;
    public static int MATCH_DEBUG_TRIAGED_MISSING;
    public static int MATCH_DEFAULT_ONLY;
    public static int MATCH_DIRECT_BOOT_AWARE;
    public static int MATCH_DIRECT_BOOT_UNAWARE;
    public static int MATCH_DISABLED_COMPONENTS;
    public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS;
    public static int MATCH_EXPLICITLY_VISIBLE_ONLY;
    public static int MATCH_FACTORY_ONLY;
    public static int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
    public static int MATCH_INSTANT;
    public static int MATCH_KNOWN_PACKAGES;
    public static int MATCH_STATIC_SHARED_LIBRARIES;
    public static int MATCH_SYSTEM_ONLY;
    public static int MATCH_UNINSTALLED_PACKAGES;
    public static int MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
    public static long MAXIMUM_VERIFICATION_TIMEOUT;
    public static int MOVE_EXTERNAL_MEDIA;
    public static int MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL;
    public static int MOVE_FAILED_DEVICE_ADMIN;
    public static int MOVE_FAILED_DOESNT_EXIST;
    public static int MOVE_FAILED_FORWARD_LOCKED;
    public static int MOVE_FAILED_INSUFFICIENT_STORAGE;
    public static int MOVE_FAILED_INTERNAL_ERROR;
    public static int MOVE_FAILED_INVALID_LOCATION;
    public static int MOVE_FAILED_LOCKED_USER;
    public static int MOVE_FAILED_OPERATION_PENDING;
    public static int MOVE_FAILED_SYSTEM_PACKAGE;
    public static int MOVE_INTERNAL;
    public static int MOVE_SUCCEEDED;
    public static int NOTIFY_PACKAGE_USE_ACTIVITY;
    public static int NOTIFY_PACKAGE_USE_BACKUP;
    public static int NOTIFY_PACKAGE_USE_BROADCAST_RECEIVER;
    public static int NOTIFY_PACKAGE_USE_CONTENT_PROVIDER;
    public static int NOTIFY_PACKAGE_USE_CROSS_PACKAGE;
    public static int NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE;
    public static int NOTIFY_PACKAGE_USE_INSTRUMENTATION;
    public static int NOTIFY_PACKAGE_USE_REASONS_COUNT;
    public static int NOTIFY_PACKAGE_USE_SERVICE;
    public static int NO_NATIVE_LIBRARIES;
    public static int ONLY_IF_NO_MATCH_FOUND;
    public static int PERMISSION_DENIED;
    public static int PERMISSION_GRANTED;
    public static int SIGNATURE_FIRST_NOT_SIGNED;
    public static int SIGNATURE_MATCH;
    public static int SIGNATURE_NEITHER_SIGNED;
    public static int SIGNATURE_NO_MATCH;
    public static int SIGNATURE_SECOND_NOT_SIGNED;
    public static int SIGNATURE_UNKNOWN_PACKAGE;
    public static int SKIP_CURRENT_PROFILE;
    public static java.lang.String SYSTEM_SHARED_LIBRARY_SERVICES;
    public static java.lang.String SYSTEM_SHARED_LIBRARY_SHARED;
    public static int VERIFICATION_ALLOW;
    public static int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT;
    public static int VERIFICATION_REJECT;
    public static int VERSION_CODE_HIGHEST;
}

-keep class android.content.pm.PackageManager$DexModuleRegisterCallback {
    <init>();

    public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);


}

-keep class android.content.pm.PackageManager$MoveCallback {
    <init>();

    public void onCreated(int, android.os.Bundle);
    public abstract void onStatusChanged(int, int, long);


}

-keep class android.content.pm.PackageManager$NameNotFoundException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.content.pm.PackageManager$OnPermissionsChangedListener {

    public abstract void onPermissionsChanged(int);


}

-keep class android.content.pm.PackageParser {
    <init>();

    public static void collectCertificates(android.content.pm.PackageParser$Package, boolean);
    public static int computeMinSdkVersion(int, java.lang.String, int, java.lang.String[], java.lang.String[]);
    public static int computeTargetSdkVersion(int, java.lang.String, java.lang.String[], java.lang.String[], boolean);
    protected android.content.pm.PackageParser$Package fromCacheEntry(byte[]);
    public static android.content.pm.PackageParser$Package fromCacheEntryStatic(byte[]);
    public static android.content.pm.ActivityInfo generateActivityInfo(android.content.pm.PackageParser$Activity, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ActivityInfo generateActivityInfo(android.content.pm.ActivityInfo, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.PackageParser$Package, int, android.content.pm.PackageUserState);
    public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.PackageParser$Package, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.ApplicationInfo, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.InstrumentationInfo generateInstrumentationInfo(android.content.pm.PackageParser$Instrumentation, int);
    public static android.content.pm.PackageInfo generatePackageInfo(android.content.pm.PackageParser$Package, int[], int, long, long, java.util.Set, android.content.pm.PackageUserState);
    public static android.content.pm.PackageInfo generatePackageInfo(android.content.pm.PackageParser$Package, int[], int, long, long, java.util.Set, android.content.pm.PackageUserState, int);
    public static android.content.pm.PermissionGroupInfo generatePermissionGroupInfo(android.content.pm.PackageParser$PermissionGroup, int);
    public static android.content.pm.PermissionInfo generatePermissionInfo(android.content.pm.PackageParser$Permission, int);
    public static android.content.pm.ProviderInfo generateProviderInfo(android.content.pm.PackageParser$Provider, int, android.content.pm.PackageUserState, int);
    public static android.content.pm.ServiceInfo generateServiceInfo(android.content.pm.PackageParser$Service, int, android.content.pm.PackageUserState, int);
    public static int getActivityConfigChanges(int, int);
    public static boolean isApkFile(java.io.File);
    public static boolean isApkPath(java.lang.String);
    public static boolean isAvailable(android.content.pm.PackageUserState);
    public static android.content.pm.PackageParser$ApkLite parseApkLite(java.io.File, int);
    public static android.content.pm.PackageParser$ApkLite parseApkLite(java.io.FileDescriptor, java.lang.String, int);
    public android.content.pm.PackageParser$Package parseMonolithicPackage(java.io.File, int);
    public android.content.pm.PackageParser$Package parsePackage(java.io.File, int, boolean);
    public android.content.pm.PackageParser$Package parsePackage(java.io.File, int);
    public static android.content.pm.PackageParser$PackageLite parsePackageLite(java.io.File, int);
    public static java.security.PublicKey parsePublicKey(java.lang.String);
    public void setCacheDir(java.io.File);
    public void setCallback(android.content.pm.PackageParser$Callback);
    public static void setCompatibilityModeEnabled(boolean);
    public void setDisplayMetrics(android.util.DisplayMetrics);
    public void setOnlyCoreApps(boolean);
    public void setSeparateProcesses(java.lang.String[]);
    protected byte[] toCacheEntry(android.content.pm.PackageParser$Package);
    public static byte[] toCacheEntryStatic(android.content.pm.PackageParser$Package);
    public static android.util.ArraySet toSigningKeys(android.content.pm.Signature[]);


    public static java.lang.String ANDROID_MANIFEST_FILENAME;
    public static java.lang.String APK_FILE_EXTENSION;
    public static android.content.pm.PackageParser$NewPermissionInfo[] NEW_PERMISSIONS;
    public static int PARSE_CHATTY;
    public static int PARSE_COLLECT_CERTIFICATES;
    public static int PARSE_ENFORCE_CODE;
    public static int PARSE_EXTERNAL_STORAGE;
    public static int PARSE_FORCE_SDK;
    public static int PARSE_FORWARD_LOCK;
    public static int PARSE_IGNORE_PROCESSES;
    public static int PARSE_IS_SYSTEM_DIR;
    public static int PARSE_MUST_BE_APK;
    public static android.content.pm.PackageParser$SplitPermissionInfo[] SPLIT_PERMISSIONS;
    public static java.util.concurrent.atomic.AtomicInteger sCachedPackageReadCount;
}

-keep class android.content.pm.PackageParser$Activity {
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ActivityInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ActivityInfo info;
}

-keep class android.content.pm.PackageParser$ActivityIntentInfo {
    <init>(android.content.pm.PackageParser$Activity);
    <init>(android.os.Parcel);

    public java.lang.String toString();


    public android.content.pm.PackageParser$Activity activity;
}

-keep class android.content.pm.PackageParser$ApkLite {
    <init>(java.lang.String, java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, int, int, int, int, java.util.List, android.content.pm.PackageParser$SigningDetails, boolean, boolean, boolean, boolean, boolean, boolean);

    public long getLongVersionCode();


    public java.lang.String codePath;
    public java.lang.String configForSplit;
    public boolean coreApp;
    public boolean debuggable;
    public boolean extractNativeLibs;
    public int installLocation;
    public boolean isFeatureSplit;
    public boolean isolatedSplits;
    public boolean multiArch;
    public java.lang.String packageName;
    public int revisionCode;
    public android.content.pm.PackageParser$SigningDetails signingDetails;
    public java.lang.String splitName;
    public boolean use32bitAbi;
    public java.lang.String usesSplitName;
    public android.content.pm.VerifierInfo[] verifiers;
    public int versionCode;
    public int versionCodeMajor;
}

-keep class android.content.pm.PackageParser$Callback {

    public abstract java.lang.String[] getOverlayApks(java.lang.String);
    public abstract java.lang.String[] getOverlayPaths(java.lang.String, java.lang.String);
    public abstract boolean hasFeature(java.lang.String);


}

-keep class android.content.pm.PackageParser$Component {
    <init>(android.content.pm.PackageParser$Package);
    <init>(android.content.pm.PackageParser$ParsePackageItemArgs, android.content.pm.PackageItemInfo);
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ComponentInfo);
    <init>(android.content.pm.PackageParser$Component);
    <init>(android.os.Parcel);

    public void appendComponentShortName(java.lang.StringBuilder);
    public android.content.ComponentName getComponentName();
    public void printComponentShortName(java.io.PrintWriter);
    public void setPackageName(java.lang.String);
    protected void writeToParcel(android.os.Parcel, int);


    public java.lang.String className;
    public java.util.ArrayList intents;
    public android.os.Bundle metaData;
    public int order;
    public android.content.pm.PackageParser$Package owner;
}

-keep class android.content.pm.PackageParser$Instrumentation {
    <init>(android.content.pm.PackageParser$ParsePackageItemArgs, android.content.pm.InstrumentationInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.InstrumentationInfo info;
}

-keep class android.content.pm.PackageParser$IntentInfo {
    <init>();
    <init>(android.os.Parcel);

    public void writeIntentInfoToParcel(android.os.Parcel, int);


    public int banner;
    public boolean hasDefault;
    public int icon;
    public int labelRes;
    public int logo;
    public java.lang.CharSequence nonLocalizedLabel;
    public int preferred;
}

-keep class android.content.pm.PackageParser$NewPermissionInfo {
    <init>(java.lang.String, int, int);



    public int fileVersion;
    public java.lang.String name;
    public int sdkVersion;
}

-keep class android.content.pm.PackageParser$Package {
    <init>(java.lang.String);
    <init>(android.os.Parcel);

    public boolean canHaveOatDir();
    public int describeContents();
    public java.util.List getAllCodePaths();
    public java.util.List getAllCodePathsExcludingResourceOnly();
    public java.util.List getChildPackageNames();
    public long getLatestForegroundPackageUseTimeInMills();
    public long getLatestPackageUseTimeInMills();
    public long getLongVersionCode();
    public boolean hasChildPackage(java.lang.String);
    public boolean hasComponentClassName(java.lang.String);
    public boolean isExternal();
    public boolean isForwardLocked();
    public boolean isLibrary();
    public boolean isMatch(int);
    public boolean isOem();
    public boolean isPrivileged();
    public boolean isProduct();
    public boolean isSystem();
    public boolean isUpdatedSystemApp();
    public boolean isVendor();
    public void setApplicationInfoBaseCodePath(java.lang.String);
    public void setApplicationInfoBaseResourcePath(java.lang.String);
    public void setApplicationInfoCodePath(java.lang.String);
    public void setApplicationInfoFlags(int, int);
    public void setApplicationInfoResourcePath(java.lang.String);
    public void setApplicationInfoSplitCodePaths(java.lang.String[]);
    public void setApplicationInfoSplitResourcePaths(java.lang.String[]);
    public void setApplicationVolumeUuid(java.lang.String);
    public void setBaseCodePath(java.lang.String);
    public void setCodePath(java.lang.String);
    public void setPackageName(java.lang.String);
    public void setSigningDetails(android.content.pm.PackageParser$SigningDetails);
    public void setSplitCodePaths(java.lang.String[]);
    public void setUse32bitAbi(boolean);
    public void setVolumeUuid(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.util.ArrayList activities;
    public android.content.pm.ApplicationInfo applicationInfo;
    public java.lang.String baseCodePath;
    public boolean baseHardwareAccelerated;
    public int baseRevisionCode;
    public java.util.ArrayList childPackages;
    public java.lang.String codePath;
    public java.util.ArrayList configPreferences;
    public boolean coreApp;
    public java.lang.String cpuAbiOverride;
    public java.util.ArrayList featureGroups;
    public int installLocation;
    public java.util.ArrayList instrumentation;
    public boolean isStub;
    public java.util.ArrayList libraryNames;
    public java.util.ArrayList mAdoptPermissions;
    public android.os.Bundle mAppMetaData;
    public int mCompileSdkVersion;
    public java.lang.String mCompileSdkVersionCodename;
    public java.lang.Object mExtras;
    public android.util.ArrayMap mKeySetMapping;
    public long[] mLastPackageUsageTimeInMills;
    public java.util.ArrayList mOriginalPackages;
    public java.lang.String mOverlayCategory;
    public boolean mOverlayIsStatic;
    public int mOverlayPriority;
    public java.lang.String mOverlayTarget;
    public int mPreferredOrder;
    public java.lang.String mRealPackage;
    public java.lang.String mRequiredAccountType;
    public boolean mRequiredForAllUsers;
    public java.lang.String mRestrictedAccountType;
    public java.lang.String mSharedUserId;
    public int mSharedUserLabel;
    public android.content.pm.PackageParser$SigningDetails mSigningDetails;
    public android.util.ArraySet mUpgradeKeySets;
    public int mVersionCode;
    public int mVersionCodeMajor;
    public java.lang.String mVersionName;
    public java.lang.String manifestPackageName;
    public java.lang.String packageName;
    public android.content.pm.PackageParser$Package parentPackage;
    public java.util.ArrayList permissionGroups;
    public java.util.ArrayList permissions;
    public java.util.ArrayList preferredActivityFilters;
    public java.util.ArrayList protectedBroadcasts;
    public java.util.ArrayList providers;
    public java.util.ArrayList receivers;
    public java.util.ArrayList reqFeatures;
    public java.util.ArrayList requestedPermissions;
    public byte[] restrictUpdateHash;
    public java.util.ArrayList services;
    public java.lang.String[] splitCodePaths;
    public int[] splitFlags;
    public java.lang.String[] splitNames;
    public int[] splitPrivateFlags;
    public int[] splitRevisionCodes;
    public java.lang.String staticSharedLibName;
    public long staticSharedLibVersion;
    public boolean use32bitAbi;
    public java.util.ArrayList usesLibraries;
    public java.lang.String[] usesLibraryFiles;
    public java.util.ArrayList usesOptionalLibraries;
    public java.util.ArrayList usesStaticLibraries;
    public java.lang.String[][] usesStaticLibrariesCertDigests;
    public long[] usesStaticLibrariesVersions;
    public boolean visibleToInstantApps;
    public java.lang.String volumeUuid;
}

-keep class android.content.pm.PackageParser$PackageLite {
    <init>(java.lang.String, android.content.pm.PackageParser$ApkLite, java.lang.String[], boolean[], java.lang.String[], java.lang.String[], java.lang.String[], int[]);

    public java.util.List getAllCodePaths();


    public java.lang.String baseCodePath;
    public int baseRevisionCode;
    public java.lang.String codePath;
    public java.lang.String[] configForSplit;
    public boolean coreApp;
    public boolean debuggable;
    public boolean extractNativeLibs;
    public int installLocation;
    public boolean[] isFeatureSplits;
    public boolean isolatedSplits;
    public boolean multiArch;
    public java.lang.String packageName;
    public java.lang.String[] splitCodePaths;
    public java.lang.String[] splitNames;
    public int[] splitRevisionCodes;
    public boolean use32bitAbi;
    public java.lang.String[] usesSplitNames;
    public android.content.pm.VerifierInfo[] verifiers;
    public int versionCode;
    public int versionCodeMajor;
}

-keep class android.content.pm.PackageParser$PackageParserException {
    <init>(int, java.lang.String);
    <init>(int, java.lang.String, java.lang.Throwable);



    public int error;
}

-keep class android.content.pm.PackageParser$ParseComponentArgs {
    <init>(android.content.pm.PackageParser$Package, java.lang.String[], int, int, int, int, int, int, java.lang.String[], int, int, int);



}

-keep class android.content.pm.PackageParser$ParsePackageItemArgs {



}

-keep class android.content.pm.PackageParser$Permission {
    <init>(android.content.pm.PackageParser$Package);
    <init>(android.content.pm.PackageParser$Package, android.content.pm.PermissionInfo);

    public int describeContents();
    public boolean isAppOp();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.PackageParser$PermissionGroup group;
    public android.content.pm.PermissionInfo info;
    public boolean tree;
}

-keep class android.content.pm.PackageParser$PermissionGroup {
    <init>(android.content.pm.PackageParser$Package);
    <init>(android.content.pm.PackageParser$Package, android.content.pm.PermissionGroupInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.PermissionGroupInfo info;
}

-keep class android.content.pm.PackageParser$Provider {
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ProviderInfo);
    <init>(android.content.pm.PackageParser$Provider);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ProviderInfo info;
    public boolean syncable;
}

-keep class android.content.pm.PackageParser$Service {
    <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ServiceInfo);

    public int describeContents();
    public void setPackageName(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ServiceInfo info;
}

-keep class android.content.pm.PackageParser$SigningDetails {
    <init>(android.content.pm.Signature[], int, android.util.ArraySet, android.content.pm.Signature[], int[]);
    <init>(android.content.pm.Signature[], int, android.content.pm.Signature[], int[]);
    <init>(android.content.pm.Signature[], int);
    <init>(android.content.pm.PackageParser$SigningDetails);
    <init>(android.os.Parcel);

    public boolean checkCapability(android.content.pm.PackageParser$SigningDetails, int);
    public boolean checkCapability(java.lang.String, int);
    public boolean checkCapabilityRecover(android.content.pm.PackageParser$SigningDetails, int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public boolean hasAncestor(android.content.pm.PackageParser$SigningDetails);
    public boolean hasAncestorOrSelf(android.content.pm.PackageParser$SigningDetails);
    public boolean hasCertificate(android.content.pm.Signature);
    public boolean hasCertificate(android.content.pm.Signature, int);
    public boolean hasCertificate(byte[]);
    public boolean hasPastSigningCertificates();
    public boolean hasSha256Certificate(byte[]);
    public boolean hasSha256Certificate(byte[], int);
    public boolean hasSignatures();
    public int hashCode();
    public boolean signaturesMatchExactly(android.content.pm.PackageParser$SigningDetails);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.content.pm.PackageParser$SigningDetails UNKNOWN;
    public android.content.pm.Signature[] pastSigningCertificates;
    public int[] pastSigningCertificatesFlags;
    public android.util.ArraySet publicKeys;
    public int signatureSchemeVersion;
    public android.content.pm.Signature[] signatures;
}

-keep class android.content.pm.PackageParser$SplitPermissionInfo {
    <init>(java.lang.String, java.lang.String[], int);



    public java.lang.String[] newPerms;
    public java.lang.String rootPerm;
    public int targetSdk;
}

-keep class android.content.pm.PackageStats {
    <init>(java.lang.String);
    <init>(java.lang.String, int);
    <init>(android.os.Parcel);
    <init>(android.content.pm.PackageStats);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public long cacheSize;
    public long codeSize;
    public long dataSize;
    public long externalCacheSize;
    public long externalCodeSize;
    public long externalDataSize;
    public long externalMediaSize;
    public long externalObbSize;
    public java.lang.String packageName;
    public int userHandle;
}

-keep class android.content.pm.PackageUserState {
    <init>();
    <init>(android.content.pm.PackageUserState);

    public boolean equals(java.lang.Object);
    public boolean isAvailable(int);
    public boolean isEnabled(android.content.pm.ComponentInfo, int);
    public boolean isMatch(android.content.pm.ComponentInfo, int);


    public int appLinkGeneration;
    public int categoryHint;
    public long ceDataInode;
    public java.lang.String dialogMessage;
    public android.util.ArraySet disabledComponents;
    public int domainVerificationStatus;
    public int enabled;
    public android.util.ArraySet enabledComponents;
    public java.lang.String harmfulAppWarning;
    public boolean hidden;
    public int installReason;
    public boolean installed;
    public boolean instantApp;
    public java.lang.String lastDisableAppCaller;
    public boolean notLaunched;
    public java.lang.String[] overlayPaths;
    public boolean stopped;
    public boolean suspended;
    public android.os.PersistableBundle suspendedAppExtras;
    public android.os.PersistableBundle suspendedLauncherExtras;
    public java.lang.String suspendingPackage;
    public boolean virtualPreload;
}

-keep class android.content.pm.ParceledListSlice {
    <init>(java.util.List);

    public int describeContents();
    public static android.content.pm.ParceledListSlice emptyList();
    public java.util.List getList();
    protected android.os.Parcelable$Creator readParcelableCreator(android.os.Parcel, java.lang.ClassLoader);
    public void setInlineCountLimit(int);
    protected void writeElement(android.os.Parcelable, android.os.Parcel, int);
    protected void writeElement(java.lang.Object, android.os.Parcel, int);
    protected void writeParcelableCreator(android.os.Parcelable, android.os.Parcel);
    protected void writeParcelableCreator(java.lang.Object, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$ClassLoaderCreator CREATOR;
}

-keep class android.content.pm.PathPermission {
    <init>(java.lang.String, int, java.lang.String, java.lang.String);
    <init>(android.os.Parcel);

    public java.lang.String getReadPermission();
    public java.lang.String getWritePermission();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.PermissionGroupInfo {
    <init>();
    <init>(android.content.pm.PermissionGroupInfo);

    public int describeContents();
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_PERSONAL_INFO;
    public int descriptionRes;
    public int flags;
    public java.lang.CharSequence nonLocalizedDescription;
    public int priority;
    public int requestRes;
}

-keep class android.content.pm.PermissionInfo {
    <init>();
    <init>(android.content.pm.PermissionInfo);

    public int calculateFootprint();
    public int describeContents();
    public static int fixProtectionLevel(int);
    public int getProtection();
    public int getProtectionFlags();
    public boolean isAppOp();
    public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
    public static java.lang.String protectionToString(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_COSTS_MONEY;
    public static int FLAG_INSTALLED;
    public static int FLAG_REMOVED;
    public static int PROTECTION_DANGEROUS;
    public static int PROTECTION_FLAG_APPOP;
    public static int PROTECTION_FLAG_DEVELOPMENT;
    public static int PROTECTION_FLAG_INSTALLER;
    public static int PROTECTION_FLAG_INSTANT;
    public static int PROTECTION_FLAG_OEM;
    public static int PROTECTION_FLAG_PRE23;
    public static int PROTECTION_FLAG_PREINSTALLED;
    public static int PROTECTION_FLAG_PRIVILEGED;
    public static int PROTECTION_FLAG_RUNTIME_ONLY;
    public static int PROTECTION_FLAG_SETUP;
    public static int PROTECTION_FLAG_SYSTEM;
    public static int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER;
    public static int PROTECTION_FLAG_VENDOR_PRIVILEGED;
    public static int PROTECTION_FLAG_VERIFIER;
    public static int PROTECTION_MASK_BASE;
    public static int PROTECTION_MASK_FLAGS;
    public static int PROTECTION_NORMAL;
    public static int PROTECTION_SIGNATURE;
    public static int PROTECTION_SIGNATURE_OR_SYSTEM;
    public int descriptionRes;
    public int flags;
    public java.lang.String group;
    public java.lang.CharSequence nonLocalizedDescription;
    public int protectionLevel;
    public int requestRes;
}

-keep class android.content.pm.ProviderInfo {
    <init>();
    <init>(android.content.pm.ProviderInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_VISIBLE_TO_INSTANT_APP;
    public java.lang.String authority;
    public int flags;
    public boolean grantUriPermissions;
    public int initOrder;
    public boolean isSyncable;
    public boolean multiprocess;
    public android.content.pm.PathPermission[] pathPermissions;
    public java.lang.String readPermission;
    public android.os.PatternMatcher[] uriPermissionPatterns;
    public java.lang.String writePermission;
}

-keep class android.content.pm.ResolveInfo {
    <init>();
    <init>(android.content.pm.ResolveInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, int);
    public android.content.pm.ComponentInfo getComponentInfo();
    public int getIconResource();
    public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
    public int resolveIconResId();
    public int resolveLabelResId();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ActivityInfo activityInfo;
    public android.content.pm.AuxiliaryResolveInfo auxiliaryInfo;
    public android.content.IntentFilter filter;
    public boolean handleAllWebDataURI;
    public int icon;
    public int iconResourceId;
    public boolean instantAppAvailable;
    public boolean isDefault;
    public boolean isInstantAppAvailable;
    public int labelRes;
    public int match;
    public boolean noResourceId;
    public java.lang.CharSequence nonLocalizedLabel;
    public int preferredOrder;
    public int priority;
    public android.content.pm.ProviderInfo providerInfo;
    public java.lang.String resolvePackageName;
    public android.content.pm.ServiceInfo serviceInfo;
    public int specificIndex;
    public boolean system;
    public int targetUserId;
}

-keep class android.content.pm.ServiceInfo {
    <init>();
    <init>(android.content.pm.ServiceInfo);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_EXTERNAL_SERVICE;
    public static int FLAG_ISOLATED_PROCESS;
    public static int FLAG_SINGLE_USER;
    public static int FLAG_STOP_WITH_TASK;
    public static int FLAG_VISIBLE_TO_INSTANT_APP;
    public int flags;
    public java.lang.String permission;
}

-keep class android.content.pm.SharedLibraryInfo {
    <init>(java.lang.String, long, int, android.content.pm.VersionedPackage, java.util.List);

    public int describeContents();
    public android.content.pm.VersionedPackage getDeclaringPackage();
    public java.util.List getDependentPackages();
    public long getLongVersion();
    public java.lang.String getName();
    public int getType();
    public int getVersion();
    public boolean isBuiltin();
    public boolean isDynamic();
    public boolean isStatic();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_BUILTIN;
    public static int TYPE_DYNAMIC;
    public static int TYPE_STATIC;
    public static int VERSION_UNDEFINED;
}

-keep class android.content.pm.Signature {
    <init>(byte[]);
    <init>(java.security.cert.Certificate[]);
    <init>(java.lang.String);

    public static boolean areEffectiveMatch(android.content.pm.Signature[], android.content.pm.Signature[]);
    public static boolean areEffectiveMatch(android.content.pm.Signature, android.content.pm.Signature);
    public static boolean areExactMatch(android.content.pm.Signature[], android.content.pm.Signature[]);
    public static android.content.pm.Signature bounce(java.security.cert.CertificateFactory, android.content.pm.Signature);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.content.pm.Signature[] getChainSignatures();
    public java.security.PublicKey getPublicKey();
    public int hashCode();
    public byte[] toByteArray();
    public char[] toChars();
    public char[] toChars(char[], int[]);
    public java.lang.String toCharsString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.SigningInfo {
    <init>();
    <init>(android.content.pm.PackageParser$SigningDetails);
    <init>(android.content.pm.SigningInfo);

    public int describeContents();
    public android.content.pm.Signature[] getApkContentsSigners();
    public android.content.pm.Signature[] getSigningCertificateHistory();
    public boolean hasMultipleSigners();
    public boolean hasPastSigningCertificates();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.UserInfo {
    <init>(int, java.lang.String, int);
    <init>(int, java.lang.String, java.lang.String, int);
    <init>();
    <init>(android.content.pm.UserInfo);

    public boolean canHaveProfile();
    public int describeContents();
    public android.os.UserHandle getUserHandle();
    public boolean isAdmin();
    public boolean isDemo();
    public boolean isEnabled();
    public boolean isEphemeral();
    public boolean isGuest();
    public boolean isInitialized();
    public boolean isManagedProfile();
    public boolean isPrimary();
    public boolean isQuietModeEnabled();
    public boolean isRestricted();
    public boolean isSystemOnly();
    public static boolean isSystemOnly(int);
    public boolean supportsSwitchTo();
    public boolean supportsSwitchToByUser();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_ADMIN;
    public static int FLAG_DEMO;
    public static int FLAG_DISABLED;
    public static int FLAG_EPHEMERAL;
    public static int FLAG_GUEST;
    public static int FLAG_INITIALIZED;
    public static int FLAG_MANAGED_PROFILE;
    public static int FLAG_MASK_USER_TYPE;
    public static int FLAG_PRIMARY;
    public static int FLAG_QUIET_MODE;
    public static int FLAG_RESTRICTED;
    public static int NO_PROFILE_GROUP_ID;
    public long creationTime;
    public int flags;
    public boolean guestToRemove;
    public java.lang.String iconPath;
    public int id;
    public java.lang.String lastLoggedInFingerprint;
    public long lastLoggedInTime;
    public java.lang.String name;
    public boolean partial;
    public int profileBadge;
    public int profileGroupId;
    public int restrictedProfileParentId;
    public int serialNumber;
}

-keep class android.content.pm.VerifierDeviceIdentity {
    <init>(long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.content.pm.VerifierDeviceIdentity generate();
    public int hashCode();
    public static android.content.pm.VerifierDeviceIdentity parse(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.VerifierInfo {
    <init>(java.lang.String, java.security.PublicKey);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String packageName;
    public java.security.PublicKey publicKey;
}

-keep class android.content.pm.VersionedPackage {
    <init>(java.lang.String, int);
    <init>(java.lang.String, long);

    public int describeContents();
    public long getLongVersionCode();
    public java.lang.String getPackageName();
    public int getVersionCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.pm.dex.ArtManager {
    <init>(android.content.Context, android.content.pm.dex.IArtManager);

    public static java.lang.String getCurrentProfilePath(java.lang.String, int, java.lang.String);
    public static java.lang.String getProfileName(java.lang.String);
    public static java.io.File getProfileSnapshotFileForName(java.lang.String, java.lang.String);
    public boolean isRuntimeProfilingEnabled(int);
    public void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, java.util.concurrent.Executor, android.content.pm.dex.ArtManager$SnapshotRuntimeProfileCallback);


    public static int PROFILE_APPS;
    public static int PROFILE_BOOT_IMAGE;
    public static int SNAPSHOT_FAILED_CODE_PATH_NOT_FOUND;
    public static int SNAPSHOT_FAILED_INTERNAL_ERROR;
    public static int SNAPSHOT_FAILED_PACKAGE_NOT_FOUND;
}

-keep class android.content.pm.dex.ArtManager$SnapshotRuntimeProfileCallback {
    <init>();

    public abstract void onError(int);
    public abstract void onSuccess(android.os.ParcelFileDescriptor);


}

-keep class android.content.pm.dex.IArtManager {

    public abstract boolean isRuntimeProfilingEnabled(int, java.lang.String);
    public abstract void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, android.content.pm.dex.ISnapshotRuntimeProfileCallback, java.lang.String);


}

-keep class android.content.pm.dex.ISnapshotRuntimeProfileCallback {

    public abstract void onError(int);
    public abstract void onSuccess(android.os.ParcelFileDescriptor);


}

-keep class android.content.res.ApkAssets {

    protected void finalize();
    public java.lang.String getAssetPath();
    public boolean isUpToDate();
    public static android.content.res.ApkAssets loadFromFd(java.io.FileDescriptor, java.lang.String, boolean, boolean);
    public static android.content.res.ApkAssets loadFromPath(java.lang.String);
    public static android.content.res.ApkAssets loadFromPath(java.lang.String, boolean);
    public static android.content.res.ApkAssets loadFromPath(java.lang.String, boolean, boolean);
    public static android.content.res.ApkAssets loadOverlayFromPath(java.lang.String, boolean);
    public android.content.res.XmlResourceParser openXml(java.lang.String);
    public java.lang.String toString();


}

-keep class android.content.res.AssetFileDescriptor {
    <init>(android.os.ParcelFileDescriptor, long, long);
    <init>(android.os.ParcelFileDescriptor, long, long, android.os.Bundle);

    public void close();
    public java.io.FileInputStream createInputStream();
    public java.io.FileOutputStream createOutputStream();
    public int describeContents();
    public long getDeclaredLength();
    public android.os.Bundle getExtras();
    public java.io.FileDescriptor getFileDescriptor();
    public long getLength();
    public android.os.ParcelFileDescriptor getParcelFileDescriptor();
    public long getStartOffset();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static long UNKNOWN_LENGTH;
}

-keep class android.content.res.AssetManager {
    <init>();

    public int addAssetPath(java.lang.String);
    public int addAssetPathAsSharedLibrary(java.lang.String);
    public int addOverlayPath(java.lang.String);
    public void close();
    protected void finalize();
    public int findCookieForPath(java.lang.String);
    public android.content.res.ApkAssets[] getApkAssets();
    public static java.lang.String getAssetAllocations();
    public android.util.SparseArray getAssignedPackageIdentifiers();
    public static int getGlobalAssetCount();
    public static int getGlobalAssetManagerCount();
    public java.lang.String[] getLocales();
    public java.lang.String[] getNonSystemLocales();
    public static android.content.res.AssetManager getSystem();
    public boolean isUpToDate();
    public java.lang.String[] list(java.lang.String);
    public java.io.InputStream open(java.lang.String);
    public java.io.InputStream open(java.lang.String, int);
    public android.content.res.AssetFileDescriptor openFd(java.lang.String);
    public java.io.InputStream openNonAsset(java.lang.String);
    public java.io.InputStream openNonAsset(java.lang.String, int);
    public java.io.InputStream openNonAsset(int, java.lang.String);
    public java.io.InputStream openNonAsset(int, java.lang.String, int);
    public android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String);
    public android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String);
    public android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String);
    public android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String);
    public void setApkAssets(android.content.res.ApkAssets[], boolean);
    public void setConfiguration(int, int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);


    public static int ACCESS_BUFFER;
    public static int ACCESS_RANDOM;
    public static int ACCESS_STREAMING;
    public static int ACCESS_UNKNOWN;
}

-keep class android.content.res.ColorStateList {
    <init>(int[][], int[]);

    public boolean canApplyTheme();
    public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
    public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
    public int describeContents();
    public int getChangingConfigurations();
    public int getColorForState(int[], int);
    public int[] getColors();
    public android.content.res.ConstantState getConstantState();
    public int getDefaultColor();
    public int[][] getStates();
    public boolean hasFocusStateSpecified();
    public boolean hasState(int);
    public boolean isOpaque();
    public boolean isStateful();
    public android.content.res.ColorStateList obtainForTheme(android.content.res.Resources$Theme);
    public android.content.res.ComplexColor obtainForTheme(android.content.res.Resources$Theme);
    public java.lang.String toString();
    public static android.content.res.ColorStateList valueOf(int);
    public android.content.res.ColorStateList withAlpha(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.content.res.CompatibilityInfo {
    <init>(android.content.pm.ApplicationInfo, int, int, boolean);

    public boolean alwaysSupportsScreen();
    public void applyToConfiguration(int, android.content.res.Configuration);
    public void applyToDisplayMetrics(android.util.DisplayMetrics);
    public static float computeCompatibleScaling(android.util.DisplayMetrics, android.util.DisplayMetrics);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.content.res.CompatibilityInfo$Translator getTranslator();
    public int hashCode();
    public boolean isScalingRequired();
    public boolean needsCompatResources();
    public boolean neverSupportsScreen();
    public boolean supportsScreen();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.content.res.CompatibilityInfo DEFAULT_COMPATIBILITY_INFO;
    public static int DEFAULT_NORMAL_SHORT_DIMENSION;
    public static float MAXIMUM_ASPECT_RATIO;
    public int applicationDensity;
    public float applicationInvertedScale;
    public float applicationScale;
}

-keep class android.content.res.CompatibilityInfo$Translator {

    public android.graphics.Rect getTranslatedContentInsets(android.graphics.Rect);
    public android.graphics.Region getTranslatedTouchableArea(android.graphics.Region);
    public android.graphics.Rect getTranslatedVisibleInsets(android.graphics.Rect);
    public void translateCanvas(android.graphics.Canvas);
    public void translateEventInScreenToAppWindow(android.view.MotionEvent);
    public void translateLayoutParamsInAppWindowToScreen(android.view.WindowManager$LayoutParams);
    public void translatePointInScreenToAppWindow(android.graphics.PointF);
    public void translateRectInAppWindowToScreen(android.graphics.Rect);
    public void translateRectInScreenToAppWinFrame(android.graphics.Rect);
    public void translateRectInScreenToAppWindow(android.graphics.Rect);
    public void translateRegionInWindowToScreen(android.graphics.Region);
    public void translateWindowLayout(android.view.WindowManager$LayoutParams);


    public float applicationInvertedScale;
    public float applicationScale;
}

-keep class android.content.res.ComplexColor {
    <init>();

    public abstract boolean canApplyTheme();
    public int getChangingConfigurations();
    public abstract android.content.res.ConstantState getConstantState();
    public abstract int getDefaultColor();
    public boolean isStateful();
    public abstract android.content.res.ComplexColor obtainForTheme(android.content.res.Resources$Theme);


}

-keep class android.content.res.Configuration {
    <init>();
    <init>(android.content.res.Configuration);

    public void clearLocales();
    public int compareTo(android.content.res.Configuration);
    public int compareTo(java.lang.Object);
    public static java.lang.String configurationDiffToString(int);
    public int describeContents();
    public int diff(android.content.res.Configuration);
    public int diff(android.content.res.Configuration, boolean, boolean);
    public int diffPublicOnly(android.content.res.Configuration);
    public boolean equals(android.content.res.Configuration);
    public boolean equals(java.lang.Object);
    public static android.content.res.Configuration generateDelta(android.content.res.Configuration, android.content.res.Configuration);
    public int getLayoutDirection();
    public android.os.LocaleList getLocales();
    public int hashCode();
    public boolean isLayoutSizeAtLeast(int);
    public boolean isOtherSeqNewer(android.content.res.Configuration);
    public boolean isScreenHdr();
    public boolean isScreenRound();
    public boolean isScreenWideColorGamut();
    public static java.lang.String localesToResourceQualifier(android.os.LocaleList);
    public void makeDefault();
    public static boolean needNewResources(int, int);
    public void readFromParcel(android.os.Parcel);
    public static void readXmlAttrs(org.xmlpull.v1.XmlPullParser, android.content.res.Configuration);
    public static int reduceScreenLayout(int, int, int);
    public static int resetScreenLayout(int);
    public static java.lang.String resourceQualifierString(android.content.res.Configuration);
    public static java.lang.String resourceQualifierString(android.content.res.Configuration, android.util.DisplayMetrics);
    public void setLayoutDirection(java.util.Locale);
    public void setLocale(java.util.Locale);
    public void setLocales(android.os.LocaleList);
    public void setTo(android.content.res.Configuration);
    public void setToDefaults();
    public java.lang.String toString();
    public static java.lang.String uiModeToString(int);
    public void unset();
    public int updateFrom(android.content.res.Configuration);
    public void writeResConfigToProto(android.util.proto.ProtoOutputStream, long, android.util.DisplayMetrics);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public static void writeXmlAttrs(org.xmlpull.v1.XmlSerializer, android.content.res.Configuration);


    public static int ASSETS_SEQ_UNDEFINED;
    public static int COLOR_MODE_HDR_MASK;
    public static int COLOR_MODE_HDR_NO;
    public static int COLOR_MODE_HDR_SHIFT;
    public static int COLOR_MODE_HDR_UNDEFINED;
    public static int COLOR_MODE_HDR_YES;
    public static int COLOR_MODE_UNDEFINED;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_MASK;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_NO;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_UNDEFINED;
    public static int COLOR_MODE_WIDE_COLOR_GAMUT_YES;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DENSITY_DPI_ANY;
    public static int DENSITY_DPI_NONE;
    public static int DENSITY_DPI_UNDEFINED;
    public static android.content.res.Configuration EMPTY;
    public static int HARDKEYBOARDHIDDEN_NO;
    public static int HARDKEYBOARDHIDDEN_UNDEFINED;
    public static int HARDKEYBOARDHIDDEN_YES;
    public static int KEYBOARDHIDDEN_NO;
    public static int KEYBOARDHIDDEN_SOFT;
    public static int KEYBOARDHIDDEN_UNDEFINED;
    public static int KEYBOARDHIDDEN_YES;
    public static int KEYBOARD_12KEY;
    public static int KEYBOARD_NOKEYS;
    public static int KEYBOARD_QWERTY;
    public static int KEYBOARD_UNDEFINED;
    public static int MNC_ZERO;
    public static int NATIVE_CONFIG_COLOR_MODE;
    public static int NATIVE_CONFIG_DENSITY;
    public static int NATIVE_CONFIG_KEYBOARD;
    public static int NATIVE_CONFIG_KEYBOARD_HIDDEN;
    public static int NATIVE_CONFIG_LAYOUTDIR;
    public static int NATIVE_CONFIG_LOCALE;
    public static int NATIVE_CONFIG_MCC;
    public static int NATIVE_CONFIG_MNC;
    public static int NATIVE_CONFIG_NAVIGATION;
    public static int NATIVE_CONFIG_ORIENTATION;
    public static int NATIVE_CONFIG_SCREEN_LAYOUT;
    public static int NATIVE_CONFIG_SCREEN_SIZE;
    public static int NATIVE_CONFIG_SMALLEST_SCREEN_SIZE;
    public static int NATIVE_CONFIG_TOUCHSCREEN;
    public static int NATIVE_CONFIG_UI_MODE;
    public static int NATIVE_CONFIG_VERSION;
    public static int NAVIGATIONHIDDEN_NO;
    public static int NAVIGATIONHIDDEN_UNDEFINED;
    public static int NAVIGATIONHIDDEN_YES;
    public static int NAVIGATION_DPAD;
    public static int NAVIGATION_NONAV;
    public static int NAVIGATION_TRACKBALL;
    public static int NAVIGATION_UNDEFINED;
    public static int NAVIGATION_WHEEL;
    public static int ORIENTATION_LANDSCAPE;
    public static int ORIENTATION_PORTRAIT;
    public static int ORIENTATION_SQUARE;
    public static int ORIENTATION_UNDEFINED;
    public static int SCREENLAYOUT_COMPAT_NEEDED;
    public static int SCREENLAYOUT_LAYOUTDIR_LTR;
    public static int SCREENLAYOUT_LAYOUTDIR_MASK;
    public static int SCREENLAYOUT_LAYOUTDIR_RTL;
    public static int SCREENLAYOUT_LAYOUTDIR_SHIFT;
    public static int SCREENLAYOUT_LAYOUTDIR_UNDEFINED;
    public static int SCREENLAYOUT_LONG_MASK;
    public static int SCREENLAYOUT_LONG_NO;
    public static int SCREENLAYOUT_LONG_UNDEFINED;
    public static int SCREENLAYOUT_LONG_YES;
    public static int SCREENLAYOUT_ROUND_MASK;
    public static int SCREENLAYOUT_ROUND_NO;
    public static int SCREENLAYOUT_ROUND_SHIFT;
    public static int SCREENLAYOUT_ROUND_UNDEFINED;
    public static int SCREENLAYOUT_ROUND_YES;
    public static int SCREENLAYOUT_SIZE_LARGE;
    public static int SCREENLAYOUT_SIZE_MASK;
    public static int SCREENLAYOUT_SIZE_NORMAL;
    public static int SCREENLAYOUT_SIZE_SMALL;
    public static int SCREENLAYOUT_SIZE_UNDEFINED;
    public static int SCREENLAYOUT_SIZE_XLARGE;
    public static int SCREENLAYOUT_UNDEFINED;
    public static int SCREEN_HEIGHT_DP_UNDEFINED;
    public static int SCREEN_WIDTH_DP_UNDEFINED;
    public static int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
    public static int TOUCHSCREEN_FINGER;
    public static int TOUCHSCREEN_NOTOUCH;
    public static int TOUCHSCREEN_STYLUS;
    public static int TOUCHSCREEN_UNDEFINED;
    public static int UI_MODE_NIGHT_MASK;
    public static int UI_MODE_NIGHT_NO;
    public static int UI_MODE_NIGHT_UNDEFINED;
    public static int UI_MODE_NIGHT_YES;
    public static int UI_MODE_TYPE_APPLIANCE;
    public static int UI_MODE_TYPE_CAR;
    public static int UI_MODE_TYPE_DESK;
    public static int UI_MODE_TYPE_MASK;
    public static int UI_MODE_TYPE_NORMAL;
    public static int UI_MODE_TYPE_TELEVISION;
    public static int UI_MODE_TYPE_UNDEFINED;
    public static int UI_MODE_TYPE_VR_HEADSET;
    public static int UI_MODE_TYPE_WATCH;
    public int assetsSeq;
    public int colorMode;
    public int compatScreenHeightDp;
    public int compatScreenWidthDp;
    public int compatSmallestScreenWidthDp;
    public int densityDpi;
    public float fontScale;
    public int hardKeyboardHidden;
    public int keyboard;
    public int keyboardHidden;
    public java.util.Locale locale;
    public int mcc;
    public int mnc;
    public int navigation;
    public int navigationHidden;
    public int orientation;
    public int screenHeightDp;
    public int screenLayout;
    public int screenWidthDp;
    public int seq;
    public int smallestScreenWidthDp;
    public int touchscreen;
    public int uiMode;
    public boolean userSetLocale;
    public android.app.WindowConfiguration windowConfiguration;
}

-keep class android.content.res.ConfigurationBoundResourceCache {
    <init>();

    public java.lang.Object getInstance(long, android.content.res.Resources, android.content.res.Resources$Theme);
    public void onConfigurationChange(int);
    public boolean shouldInvalidateEntry(android.content.res.ConstantState, int);
    public boolean shouldInvalidateEntry(java.lang.Object, int);


}

-keep class android.content.res.ConstantState {
    <init>();

    public abstract int getChangingConfigurations();
    public abstract java.lang.Object newInstance();
    public java.lang.Object newInstance(android.content.res.Resources);
    public java.lang.Object newInstance(android.content.res.Resources, android.content.res.Resources$Theme);


}

-keep class android.content.res.FontResourcesParser {
    <init>();

    public static android.content.res.FontResourcesParser$FamilyResourceEntry parse(org.xmlpull.v1.XmlPullParser, android.content.res.Resources);


}

-keep class android.content.res.FontResourcesParser$FamilyResourceEntry {



}

-keep class android.content.res.Resources {
    <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
    <init>(java.lang.ClassLoader);

    public int calcConfigChanges(android.content.res.Configuration);
    public void finishPreloading();
    public void flushLayoutCache();
    public android.content.res.XmlResourceParser getAnimation(int);
    public android.content.res.ConfigurationBoundResourceCache getAnimatorCache();
    public android.content.res.AssetManager getAssets();
    public boolean getBoolean(int);
    public java.lang.ClassLoader getClassLoader();
    public int getColor(int);
    public int getColor(int, android.content.res.Resources$Theme);
    public android.content.res.ColorStateList getColorStateList(int);
    public android.content.res.ColorStateList getColorStateList(int, android.content.res.Resources$Theme);
    public android.content.res.CompatibilityInfo getCompatibilityInfo();
    public android.content.res.Configuration getConfiguration();
    public float getDimension(int);
    public int getDimensionPixelOffset(int);
    public int getDimensionPixelSize(int);
    public android.view.DisplayAdjustments getDisplayAdjustments();
    public android.util.DisplayMetrics getDisplayMetrics();
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.graphics.drawable.Drawable getDrawable(int, android.content.res.Resources$Theme);
    public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
    public android.graphics.drawable.Drawable getDrawableForDensity(int, int, android.content.res.Resources$Theme);
    public android.graphics.drawable.DrawableInflater getDrawableInflater();
    public float getFloat(int);
    public android.graphics.Typeface getFont(int);
    public float getFraction(int, int, int);
    public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
    public android.content.res.ResourcesImpl getImpl();
    public int[] getIntArray(int);
    public int getInteger(int);
    public android.content.res.XmlResourceParser getLayout(int);
    public android.graphics.Movie getMovie(int);
    public android.util.LongSparseArray getPreloadedDrawables();
    public java.lang.String getQuantityString(int, int, java.lang.Object[]);
    public java.lang.String getQuantityString(int, int);
    public java.lang.CharSequence getQuantityText(int, int);
    public java.lang.String getResourceEntryName(int);
    public java.lang.String getResourceName(int);
    public java.lang.String getResourcePackageName(int);
    public java.lang.String getResourceTypeName(int);
    public android.content.res.Configuration[] getSizeConfigurations();
    public android.content.res.ConfigurationBoundResourceCache getStateListAnimatorCache();
    public java.lang.String getString(int);
    public java.lang.String getString(int, java.lang.Object[]);
    public java.lang.String[] getStringArray(int);
    public static android.content.res.Resources getSystem();
    public java.lang.CharSequence getText(int);
    public java.lang.CharSequence getText(int, java.lang.CharSequence);
    public java.lang.CharSequence[] getTextArray(int);
    public void getValue(int, android.util.TypedValue, boolean);
    public void getValue(java.lang.String, android.util.TypedValue, boolean);
    public void getValueForDensity(int, int, android.util.TypedValue, boolean);
    public android.content.res.XmlResourceParser getXml(int);
    public android.content.res.ComplexColor loadComplexColor(android.util.TypedValue, int, android.content.res.Resources$Theme);
    public android.content.res.Resources$Theme newTheme();
    public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
    public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources$Theme, android.util.AttributeSet, int[]);
    public android.content.res.TypedArray obtainTypedArray(int);
    public java.io.InputStream openRawResource(int);
    public java.io.InputStream openRawResource(int, android.util.TypedValue);
    public android.content.res.AssetFileDescriptor openRawResourceFd(int);
    public void parseBundleExtra(java.lang.String, android.util.AttributeSet, android.os.Bundle);
    public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle);
    public void preloadFonts(int);
    public static boolean resourceHasPackage(int);
    public static int selectDefaultTheme(int, int);
    public static int selectSystemTheme(int, int, int, int, int, int);
    public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
    public void setImpl(android.content.res.ResourcesImpl);
    public void startPreloading();
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);
    public static void updateSystemConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);


}

-keep class android.content.res.Resources$NotFoundException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Exception);



}

-keep class android.content.res.Resources$Theme {

    public void applyStyle(int, boolean);
    public void dump(int, java.lang.String, java.lang.String);
    public void encode(android.view.ViewHierarchyEncoder);
    public int[] getAllAttributes();
    public int getChangingConfigurations();
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.content.res.Resources$ThemeKey getKey();
    public android.content.res.Resources getResources();
    public java.lang.String[] getTheme();
    public android.content.res.TypedArray obtainStyledAttributes(int[]);
    public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
    public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
    public void rebase();
    public boolean resolveAttribute(int, android.util.TypedValue, boolean);
    public android.content.res.TypedArray resolveAttributes(int[], int[]);
    public void setTo(android.content.res.Resources$Theme);


}

-keep class android.content.res.Resources$ThemeKey {

    public void append(int, boolean);
    public android.content.res.Resources$ThemeKey clone();
    public java.lang.Object clone();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void setTo(android.content.res.Resources$ThemeKey);


}

-keep class android.content.res.ResourcesImpl {
    <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration, android.view.DisplayAdjustments);

    public int calcConfigChanges(android.content.res.Configuration);
    public void flushLayoutCache();
    public android.content.res.AssetManager getAssets();
    public android.view.DisplayAdjustments getDisplayAdjustments();
    public android.graphics.Typeface loadFont(android.content.res.Resources, android.util.TypedValue, int);
    public void startPreloading();
    public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);


    public static boolean TRACE_FOR_DETAILED_PRELOAD;
}

-keep class android.content.res.ThemedResourceCache {

    public java.lang.Object get(long, android.content.res.Resources$Theme);
    public void onConfigurationChange(int);
    public void put(long, android.content.res.Resources$Theme, java.lang.Object);
    public void put(long, android.content.res.Resources$Theme, java.lang.Object, boolean);
    protected abstract boolean shouldInvalidateEntry(java.lang.Object, int);


}

-keep class android.content.res.TypedArray {
    <init>(android.content.res.Resources);

    public int[] extractThemeAttrs();
    public int[] extractThemeAttrs(int[]);
    public boolean getBoolean(int, boolean);
    public int getChangingConfigurations();
    public int getColor(int, int);
    public android.content.res.ColorStateList getColorStateList(int);
    public android.content.res.ComplexColor getComplexColor(int);
    public float getDimension(int, float);
    public int getDimensionPixelOffset(int, int);
    public int getDimensionPixelSize(int, int);
    public android.graphics.drawable.Drawable getDrawable(int);
    public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
    public float getFloat(int, float);
    public android.graphics.Typeface getFont(int);
    public float getFraction(int, int, int, float);
    public int getIndex(int);
    public int getIndexCount();
    public int getInt(int, int);
    public int getInteger(int, int);
    public int getLayoutDimension(int, java.lang.String);
    public int getLayoutDimension(int, int);
    public java.lang.String getNonConfigurationString(int, int);
    public java.lang.String getNonResourceString(int);
    public java.lang.String getPositionDescription();
    public int getResourceId(int, int);
    public android.content.res.Resources getResources();
    public java.lang.String getString(int);
    public java.lang.CharSequence getText(int);
    public java.lang.CharSequence[] getTextArray(int);
    public int getThemeAttributeId(int, int);
    public int getType(int);
    public boolean getValue(int, android.util.TypedValue);
    public boolean hasValue(int);
    public boolean hasValueOrEmpty(int);
    public int length();
    public android.util.TypedValue peekValue(int);
    public void recycle();
    public java.lang.String toString();


}

-keep class android.content.res.XmlResourceParser {

    public abstract void close();
    public abstract java.lang.String getAttributeNamespace(int);


}

-keep class android.database.CharArrayBuffer {
    <init>(int);
    <init>(char[]);



    public char[] data;
    public int sizeCopied;
}

-keep class android.database.ContentObserver {
    <init>(android.os.Handler);

    public boolean deliverSelfNotifications();
    public void dispatchChange(boolean);
    public void dispatchChange(boolean, android.net.Uri);
    public android.database.IContentObserver getContentObserver();
    public void onChange(boolean);
    public void onChange(boolean, android.net.Uri);
    public void onChange(boolean, android.net.Uri, int);
    public android.database.IContentObserver releaseContentObserver();


}

-keep class android.database.Cursor {

    public abstract void close();
    public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer);
    public abstract void deactivate();
    public abstract byte[] getBlob(int);
    public abstract int getColumnCount();
    public abstract int getColumnIndex(java.lang.String);
    public abstract int getColumnIndexOrThrow(java.lang.String);
    public abstract java.lang.String getColumnName(int);
    public abstract java.lang.String[] getColumnNames();
    public abstract int getCount();
    public abstract double getDouble(int);
    public abstract android.os.Bundle getExtras();
    public abstract float getFloat(int);
    public abstract int getInt(int);
    public abstract long getLong(int);
    public abstract android.net.Uri getNotificationUri();
    public abstract int getPosition();
    public abstract short getShort(int);
    public abstract java.lang.String getString(int);
    public abstract int getType(int);
    public abstract boolean getWantsAllOnMoveCalls();
    public abstract boolean isAfterLast();
    public abstract boolean isBeforeFirst();
    public abstract boolean isClosed();
    public abstract boolean isFirst();
    public abstract boolean isLast();
    public abstract boolean isNull(int);
    public abstract boolean move(int);
    public abstract boolean moveToFirst();
    public abstract boolean moveToLast();
    public abstract boolean moveToNext();
    public abstract boolean moveToPosition(int);
    public abstract boolean moveToPrevious();
    public abstract void registerContentObserver(android.database.ContentObserver);
    public abstract void registerDataSetObserver(android.database.DataSetObserver);
    public abstract boolean requery();
    public abstract android.os.Bundle respond(android.os.Bundle);
    public abstract void setExtras(android.os.Bundle);
    public abstract void setNotificationUri(android.content.ContentResolver, android.net.Uri);
    public abstract void unregisterContentObserver(android.database.ContentObserver);
    public abstract void unregisterDataSetObserver(android.database.DataSetObserver);


    public static int FIELD_TYPE_BLOB;
    public static int FIELD_TYPE_FLOAT;
    public static int FIELD_TYPE_INTEGER;
    public static int FIELD_TYPE_NULL;
    public static int FIELD_TYPE_STRING;
}

-keep class android.database.CursorWindow {
    <init>(java.lang.String);
    <init>(java.lang.String, long);
    <init>(boolean);

    public boolean allocRow();
    public void clear();
    public void copyStringToBuffer(int, int, android.database.CharArrayBuffer);
    public int describeContents();
    protected void finalize();
    public void freeLastRow();
    public byte[] getBlob(int, int);
    public double getDouble(int, int);
    public float getFloat(int, int);
    public int getInt(int, int);
    public long getLong(int, int);
    public java.lang.String getName();
    public int getNumRows();
    public short getShort(int, int);
    public int getStartPosition();
    public java.lang.String getString(int, int);
    public int getType(int, int);
    public boolean isBlob(int, int);
    public boolean isFloat(int, int);
    public boolean isLong(int, int);
    public boolean isNull(int, int);
    public boolean isString(int, int);
    public static android.database.CursorWindow newFromParcel(android.os.Parcel);
    protected void onAllReferencesReleased();
    public boolean putBlob(byte[], int, int);
    public boolean putDouble(double, int, int);
    public boolean putLong(long, int, int);
    public boolean putNull(int, int);
    public boolean putString(java.lang.String, int, int);
    public boolean setNumColumns(int);
    public void setStartPosition(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public long mWindowPtr;
}

-keep class android.database.DataSetObserver {
    <init>();

    public void onChanged();
    public void onInvalidated();


}

-keep class android.database.DatabaseErrorHandler {

    public abstract void onCorruption(android.database.sqlite.SQLiteDatabase);


}

-keep class android.database.IContentObserver {

    public abstract void onChange(boolean, android.net.Uri, int);


}

-keep class android.database.SQLException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);



}

-keep class android.database.sqlite.SQLiteClosable {
    <init>();

    public void acquireReference();
    public void close();
    protected abstract void onAllReferencesReleased();
    protected void onAllReferencesReleasedFromContainer();
    public void releaseReference();
    public void releaseReferenceFromContainer();


}

-keep class android.database.sqlite.SQLiteConnection {

    public void dump(android.util.Printer, boolean);
    public void execute(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public int executeForChangedRowCount(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public int executeForCursorWindow(java.lang.String, java.lang.Object[], android.database.CursorWindow, int, int, boolean, android.os.CancellationSignal);
    public long executeForLastInsertedRowId(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public long executeForLong(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    public java.lang.String executeForString(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
    protected void finalize();
    public int getConnectionId();
    public boolean isPrimaryConnection();
    public void onCancel();
    public void prepare(java.lang.String, android.database.sqlite.SQLiteStatementInfo);
    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteConnectionPool {

    public android.database.sqlite.SQLiteConnection acquireConnection(java.lang.String, int, android.os.CancellationSignal);
    public void close();
    public void collectDbStats(java.util.ArrayList);
    public void dump(android.util.Printer, boolean);
    protected void finalize();
    public static android.database.sqlite.SQLiteConnectionPool open(android.database.sqlite.SQLiteDatabaseConfiguration);
    public void reconfigure(android.database.sqlite.SQLiteDatabaseConfiguration);
    public void releaseConnection(android.database.sqlite.SQLiteConnection);
    public void setupIdleConnectionHandler(android.os.Looper, long);
    public boolean shouldYieldConnection(android.database.sqlite.SQLiteConnection, int);
    public java.lang.String toString();


    public static int CONNECTION_FLAG_INTERACTIVE;
    public static int CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY;
    public static int CONNECTION_FLAG_READ_ONLY;
}

-keep class android.database.sqlite.SQLiteCursorDriver {

    public abstract void cursorClosed();
    public abstract void cursorDeactivated();
    public abstract void cursorRequeried(android.database.Cursor);
    public abstract android.database.Cursor query(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String[]);
    public abstract void setBindArguments(java.lang.String[]);


}

-keep class android.database.sqlite.SQLiteCustomFunction {
    <init>(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CustomFunction);



    public android.database.sqlite.SQLiteDatabase$CustomFunction callback;
    public java.lang.String name;
    public int numArgs;
}

-keep class android.database.sqlite.SQLiteDatabase {

    public void addCustomFunction(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CustomFunction);
    public void beginTransaction();
    public void beginTransactionNonExclusive();
    public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener);
    public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
    public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String);
    public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase$CursorFactory);
    public static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase$OpenParams);
    public int delete(java.lang.String, java.lang.String, java.lang.String[]);
    public static boolean deleteDatabase(java.io.File);
    public void disableWriteAheadLogging();
    public boolean enableWriteAheadLogging();
    public void endTransaction();
    public void execSQL(java.lang.String);
    public void execSQL(java.lang.String, java.lang.Object[]);
    protected void finalize();
    public static java.lang.String findEditTable(java.lang.String);
    public java.util.List getAttachedDbs();
    public long getMaximumSize();
    public long getPageSize();
    public java.lang.String getPath();
    public java.util.Map getSyncedTables();
    public int getVersion();
    public boolean inTransaction();
    public long insert(java.lang.String, java.lang.String, android.content.ContentValues);
    public long insertOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
    public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int);
    public boolean isDatabaseIntegrityOk();
    public boolean isDbLockedByCurrentThread();
    public boolean isDbLockedByOtherThreads();
    public boolean isInMemoryDatabase();
    public boolean isOpen();
    public boolean isReadOnly();
    public boolean isWriteAheadLoggingEnabled();
    public void markTableSyncable(java.lang.String, java.lang.String);
    public void markTableSyncable(java.lang.String, java.lang.String, java.lang.String);
    public boolean needUpgrade(int);
    protected void onAllReferencesReleased();
    public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int);
    public static android.database.sqlite.SQLiteDatabase openDatabase(java.io.File, android.database.sqlite.SQLiteDatabase$OpenParams);
    public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int, android.database.DatabaseErrorHandler);
    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory);
    public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
    public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
    public android.database.Cursor rawQuery(java.lang.String, java.lang.String[]);
    public android.database.Cursor rawQuery(java.lang.String, java.lang.String[], android.os.CancellationSignal);
    public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String);
    public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    public static int releaseMemory();
    public void reopenReadWrite();
    public long replace(java.lang.String, java.lang.String, android.content.ContentValues);
    public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
    public void setForeignKeyConstraintsEnabled(boolean);
    public void setLocale(java.util.Locale);
    public void setLockingEnabled(boolean);
    public void setMaxSqlCacheSize(int);
    public long setMaximumSize(long);
    public void setPageSize(long);
    public void setTransactionSuccessful();
    public void setVersion(int);
    public java.lang.String toString();
    public int update(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[]);
    public int updateWithOnConflict(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[], int);
    public void validateSql(java.lang.String, android.os.CancellationSignal);
    public boolean yieldIfContended();
    public boolean yieldIfContendedSafely();
    public boolean yieldIfContendedSafely(long);


    public static int CONFLICT_ABORT;
    public static int CONFLICT_FAIL;
    public static int CONFLICT_IGNORE;
    public static int CONFLICT_NONE;
    public static int CONFLICT_REPLACE;
    public static int CONFLICT_ROLLBACK;
    public static int CREATE_IF_NECESSARY;
    public static int DISABLE_COMPATIBILITY_WAL;
    public static int ENABLE_WRITE_AHEAD_LOGGING;
    public static int MAX_SQL_CACHE_SIZE;
    public static int NO_LOCALIZED_COLLATORS;
    public static int OPEN_READONLY;
    public static int OPEN_READWRITE;
    public static int SQLITE_MAX_LIKE_PATTERN_LENGTH;
}

-keep class android.database.sqlite.SQLiteDatabase$CursorFactory {

    public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);


}

-keep class android.database.sqlite.SQLiteDatabase$CustomFunction {

    public abstract void callback(java.lang.String[]);


}

-keep class android.database.sqlite.SQLiteDatabase$OpenParams {

    public android.database.sqlite.SQLiteDatabase$CursorFactory getCursorFactory();
    public android.database.DatabaseErrorHandler getErrorHandler();
    public long getIdleConnectionTimeout();
    public java.lang.String getJournalMode();
    public int getLookasideSlotCount();
    public int getLookasideSlotSize();
    public int getOpenFlags();
    public java.lang.String getSynchronousMode();
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder toBuilder();


}

-keep class android.database.sqlite.SQLiteDatabase$OpenParams$Builder {
    <init>();
    <init>(android.database.sqlite.SQLiteDatabase$OpenParams);

    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder addOpenFlags(int);
    public android.database.sqlite.SQLiteDatabase$OpenParams build();
    public boolean isWriteAheadLoggingEnabled();
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder removeOpenFlags(int);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setCursorFactory(android.database.sqlite.SQLiteDatabase$CursorFactory);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setErrorHandler(android.database.DatabaseErrorHandler);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setIdleConnectionTimeout(long);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setJournalMode(java.lang.String);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setLookasideConfig(int, int);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setOpenFlags(int);
    public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setSynchronousMode(java.lang.String);
    public void setWriteAheadLoggingEnabled(boolean);


}

-keep class android.database.sqlite.SQLiteDatabaseConfiguration {
    <init>(java.lang.String, int);
    <init>(android.database.sqlite.SQLiteDatabaseConfiguration);

    public boolean isInMemoryDb();
    public void updateParametersFrom(android.database.sqlite.SQLiteDatabaseConfiguration);


    public static java.lang.String MEMORY_DB_PATH;
    public java.util.ArrayList customFunctions;
    public boolean foreignKeyConstraintsEnabled;
    public long idleConnectionTimeoutMs;
    public java.lang.String journalMode;
    public java.lang.String label;
    public java.util.Locale locale;
    public int lookasideSlotCount;
    public int lookasideSlotSize;
    public int maxSqlCacheSize;
    public int openFlags;
    public java.lang.String path;
    public java.lang.String syncMode;
}

-keep class android.database.sqlite.SQLiteDebug {

    public static void dump(android.util.Printer, java.lang.String[]);
    public static android.database.sqlite.SQLiteDebug$PagerStats getDatabaseInfo();
    public static boolean shouldLogSlowQuery(long);


    public static boolean DEBUG_LOG_SLOW_QUERIES;
    public static boolean DEBUG_SQL_LOG;
    public static boolean DEBUG_SQL_STATEMENTS;
    public static boolean DEBUG_SQL_TIME;
}

-keep class android.database.sqlite.SQLiteDebug$DbStats {
    <init>(java.lang.String, long, long, int, int, int, int);



    public java.lang.String cache;
    public java.lang.String dbName;
    public long dbSize;
    public int lookaside;
    public long pageSize;
}

-keep class android.database.sqlite.SQLiteDebug$PagerStats {
    <init>();



    public java.util.ArrayList dbStats;
    public int largestMemAlloc;
    public int memoryUsed;
    public int pageCacheOverflow;
}

-keep class android.database.sqlite.SQLiteProgram {

    public void bindAllArgsAsStrings(java.lang.String[]);
    public void bindBlob(int, byte[]);
    public void bindDouble(int, double);
    public void bindLong(int, long);
    public void bindNull(int);
    public void bindString(int, java.lang.String);
    public void clearBindings();
    protected int getConnectionFlags();
    protected android.database.sqlite.SQLiteSession getSession();
    public int getUniqueId();
    protected void onAllReferencesReleased();
    protected void onCorruption();


}

-keep class android.database.sqlite.SQLiteQuery {

    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteSession {
    <init>(android.database.sqlite.SQLiteConnectionPool);

    public void beginTransaction(int, android.database.sqlite.SQLiteTransactionListener, int, android.os.CancellationSignal);
    public void endTransaction(android.os.CancellationSignal);
    public void execute(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public android.os.ParcelFileDescriptor executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public int executeForChangedRowCount(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public int executeForCursorWindow(java.lang.String, java.lang.Object[], android.database.CursorWindow, int, int, boolean, int, android.os.CancellationSignal);
    public long executeForLastInsertedRowId(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public long executeForLong(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public java.lang.String executeForString(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
    public boolean hasConnection();
    public boolean hasNestedTransaction();
    public boolean hasTransaction();
    public void prepare(java.lang.String, int, android.os.CancellationSignal, android.database.sqlite.SQLiteStatementInfo);
    public void setTransactionSuccessful();
    public boolean yieldTransaction(long, boolean, android.os.CancellationSignal);


    public static int TRANSACTION_MODE_DEFERRED;
    public static int TRANSACTION_MODE_EXCLUSIVE;
    public static int TRANSACTION_MODE_IMMEDIATE;
}

-keep class android.database.sqlite.SQLiteStatement {

    public void execute();
    public long executeInsert();
    public int executeUpdateDelete();
    public android.os.ParcelFileDescriptor simpleQueryForBlobFileDescriptor();
    public long simpleQueryForLong();
    public java.lang.String simpleQueryForString();
    public java.lang.String toString();


}

-keep class android.database.sqlite.SQLiteStatementInfo {
    <init>();



    public java.lang.String[] columnNames;
    public int numParameters;
    public boolean readOnly;
}

-keep class android.database.sqlite.SQLiteTransactionListener {

    public abstract void onBegin();
    public abstract void onCommit();
    public abstract void onRollback();


}

-keep class android.graphics.BaseCanvas {
    <init>();

    protected static void checkRange(int, int, int);
    public void drawARGB(int, int, int, int);
    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
    public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
    public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
    public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
    public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
    public void drawCircle(float, float, float, android.graphics.Paint);
    public void drawColor(int);
    public void drawColor(int, android.graphics.PorterDuff$Mode);
    public void drawLine(float, float, float, float, android.graphics.Paint);
    public void drawLines(float[], int, int, android.graphics.Paint);
    public void drawLines(float[], android.graphics.Paint);
    public void drawOval(float, float, float, float, android.graphics.Paint);
    public void drawOval(android.graphics.RectF, android.graphics.Paint);
    public void drawPaint(android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
    public void drawPath(android.graphics.Path, android.graphics.Paint);
    public void drawPoint(float, float, android.graphics.Paint);
    public void drawPoints(float[], int, int, android.graphics.Paint);
    public void drawPoints(float[], android.graphics.Paint);
    public void drawPosText(char[], int, int, float[], android.graphics.Paint);
    public void drawPosText(java.lang.String, float[], android.graphics.Paint);
    public void drawRGB(int, int, int);
    public void drawRect(float, float, float, float, android.graphics.Paint);
    public void drawRect(android.graphics.Rect, android.graphics.Paint);
    public void drawRect(android.graphics.RectF, android.graphics.Paint);
    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    public void drawText(char[], int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
    public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
    public boolean isHardwareAccelerated();
    public boolean isHwBitmapsInSwModeEnabled();
    protected void onHwBitmapInSwMode();
    public void setHwBitmapsInSwModeEnabled(boolean);
    protected void throwIfCannotDraw(android.graphics.Bitmap);


    protected int mDensity;
    protected long mNativeCanvasWrapper;
    protected int mScreenDensity;
}

-keep class android.graphics.Bitmap {

    public boolean compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream);
    public android.graphics.Bitmap copy(android.graphics.Bitmap$Config, boolean);
    public void copyPixelsFromBuffer(java.nio.Buffer);
    public void copyPixelsToBuffer(java.nio.Buffer);
    public android.graphics.Bitmap createAshmemBitmap();
    public android.graphics.Bitmap createAshmemBitmap(android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap);
    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int);
    public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int, android.graphics.Matrix, boolean);
    public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config, boolean);
    public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config, boolean, android.graphics.ColorSpace);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config, boolean);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config, boolean, android.graphics.ColorSpace);
    public static android.graphics.Bitmap createBitmap(int[], int, int, int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(int[], int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, android.graphics.Bitmap$Config);
    public static android.graphics.Bitmap createBitmap(android.graphics.Picture);
    public static android.graphics.Bitmap createBitmap(android.graphics.Picture, int, int, android.graphics.Bitmap$Config);
    public android.graphics.GraphicBuffer createGraphicBufferHandle();
    public static android.graphics.Bitmap createHardwareBitmap(android.graphics.GraphicBuffer);
    public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, boolean);
    public int describeContents();
    public void eraseColor(int);
    public android.graphics.Bitmap extractAlpha();
    public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
    public int getAllocationByteCount();
    public int getByteCount();
    public android.graphics.ColorSpace getColorSpace();
    public android.graphics.Bitmap$Config getConfig();
    public int getDensity();
    public int getGenerationId();
    public int getHeight();
    public long getNativeInstance();
    public byte[] getNinePatchChunk();
    public android.graphics.NinePatch$InsetStruct getNinePatchInsets();
    public void getOpticalInsets(android.graphics.Rect);
    public int getPixel(int, int);
    public void getPixels(int[], int, int, int, int, int, int);
    public int getRowBytes();
    public int getScaledHeight(android.graphics.Canvas);
    public int getScaledHeight(android.util.DisplayMetrics);
    public int getScaledHeight(int);
    public int getScaledWidth(android.graphics.Canvas);
    public int getScaledWidth(android.util.DisplayMetrics);
    public int getScaledWidth(int);
    public int getWidth();
    public boolean hasAlpha();
    public boolean hasMipMap();
    public boolean isMutable();
    public boolean isPremultiplied();
    public boolean isRecycled();
    public void makeImmutable();
    public void prepareToDraw();
    public void reconfigure(int, int, android.graphics.Bitmap$Config);
    public void recycle();
    public boolean sameAs(android.graphics.Bitmap);
    public static int scaleFromDensity(int, int, int);
    public void setConfig(android.graphics.Bitmap$Config);
    public static void setDefaultDensity(int);
    public void setDensity(int);
    public void setHasAlpha(boolean);
    public void setHasMipMap(boolean);
    public void setHeight(int);
    public void setNinePatchChunk(byte[]);
    public void setPixel(int, int, int);
    public void setPixels(int[], int, int, int, int, int, int);
    public void setPremultiplied(boolean);
    public void setWidth(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int DENSITY_NONE;
    public int mDensity;
    public static volatile int sPreloadTracingNumInstantiatedBitmaps;
    public static volatile long sPreloadTracingTotalBitmapsSize;
}

-keep class android.graphics.Bitmap$CompressFormat {

    public static android.graphics.Bitmap$CompressFormat valueOf(java.lang.String);
    public static android.graphics.Bitmap$CompressFormat[] values();

    public static android.graphics.Bitmap$CompressFormat JPEG;
    public static android.graphics.Bitmap$CompressFormat PNG;
    public static android.graphics.Bitmap$CompressFormat WEBP;

}

-keep class android.graphics.Bitmap$Config {

    public static android.graphics.Bitmap$Config valueOf(java.lang.String);
    public static android.graphics.Bitmap$Config[] values();

    public static android.graphics.Bitmap$Config ALPHA_8;
    public static android.graphics.Bitmap$Config ARGB_4444;
    public static android.graphics.Bitmap$Config ARGB_8888;
    public static android.graphics.Bitmap$Config HARDWARE;
    public static android.graphics.Bitmap$Config RGBA_F16;
    public static android.graphics.Bitmap$Config RGB_565;

}

-keep class android.graphics.BitmapFactory {
    <init>();

    public static android.graphics.Bitmap decodeByteArray(byte[], int, int, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeByteArray(byte[], int, int);
    public static android.graphics.Bitmap decodeFile(java.lang.String, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeFile(java.lang.String);
    public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor, android.graphics.Rect, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor);
    public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int);
    public static android.graphics.Bitmap decodeResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeStream(java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
    public static android.graphics.Bitmap decodeStream(java.io.InputStream);


}

-keep class android.graphics.BitmapFactory$Options {
    <init>();

    public void requestCancelDecode();


    public android.graphics.Bitmap inBitmap;
    public int inDensity;
    public boolean inDither;
    public boolean inInputShareable;
    public boolean inJustDecodeBounds;
    public boolean inMutable;
    public boolean inPreferQualityOverSpeed;
    public android.graphics.ColorSpace inPreferredColorSpace;
    public android.graphics.Bitmap$Config inPreferredConfig;
    public boolean inPremultiplied;
    public boolean inPurgeable;
    public int inSampleSize;
    public boolean inScaled;
    public int inScreenDensity;
    public int inTargetDensity;
    public byte[] inTempStorage;
    public boolean mCancel;
    public android.graphics.ColorSpace outColorSpace;
    public android.graphics.Bitmap$Config outConfig;
    public int outHeight;
    public java.lang.String outMimeType;
    public int outWidth;
}

-keep class android.graphics.Canvas {
    <init>();
    <init>(android.graphics.Bitmap);
    <init>(long);

    public boolean clipOutPath(android.graphics.Path);
    public boolean clipOutRect(android.graphics.RectF);
    public boolean clipOutRect(android.graphics.Rect);
    public boolean clipOutRect(float, float, float, float);
    public boolean clipOutRect(int, int, int, int);
    public boolean clipPath(android.graphics.Path, android.graphics.Region$Op);
    public boolean clipPath(android.graphics.Path);
    public boolean clipRect(android.graphics.RectF, android.graphics.Region$Op);
    public boolean clipRect(android.graphics.Rect, android.graphics.Region$Op);
    public boolean clipRect(android.graphics.RectF);
    public boolean clipRect(android.graphics.Rect);
    public boolean clipRect(float, float, float, float, android.graphics.Region$Op);
    public boolean clipRect(float, float, float, float);
    public boolean clipRect(int, int, int, int);
    public boolean clipRectUnion(android.graphics.Rect);
    public boolean clipRegion(android.graphics.Region, android.graphics.Region$Op);
    public boolean clipRegion(android.graphics.Region);
    public void concat(android.graphics.Matrix);
    public void drawARGB(int, int, int, int);
    public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
    public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
    public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
    public void drawCircle(float, float, float, android.graphics.Paint);
    public void drawColor(int);
    public void drawColor(int, android.graphics.PorterDuff$Mode);
    public void drawLine(float, float, float, float, android.graphics.Paint);
    public void drawLines(float[], int, int, android.graphics.Paint);
    public void drawLines(float[], android.graphics.Paint);
    public void drawOval(android.graphics.RectF, android.graphics.Paint);
    public void drawOval(float, float, float, float, android.graphics.Paint);
    public void drawPaint(android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
    public void drawPath(android.graphics.Path, android.graphics.Paint);
    public void drawPicture(android.graphics.Picture);
    public void drawPicture(android.graphics.Picture, android.graphics.RectF);
    public void drawPicture(android.graphics.Picture, android.graphics.Rect);
    public void drawPoint(float, float, android.graphics.Paint);
    public void drawPoints(float[], int, int, android.graphics.Paint);
    public void drawPoints(float[], android.graphics.Paint);
    public void drawPosText(char[], int, int, float[], android.graphics.Paint);
    public void drawPosText(java.lang.String, float[], android.graphics.Paint);
    public void drawRGB(int, int, int);
    public void drawRect(android.graphics.RectF, android.graphics.Paint);
    public void drawRect(android.graphics.Rect, android.graphics.Paint);
    public void drawRect(float, float, float, float, android.graphics.Paint);
    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
    public void drawText(char[], int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
    public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
    public static void freeCaches();
    public static void freeTextLayoutCaches();
    public boolean getClipBounds(android.graphics.Rect);
    public android.graphics.Rect getClipBounds();
    public int getDensity();
    public android.graphics.DrawFilter getDrawFilter();
    protected javax.microedition.khronos.opengles.GL getGL();
    public int getHeight();
    public void getMatrix(android.graphics.Matrix);
    public android.graphics.Matrix getMatrix();
    public int getMaximumBitmapHeight();
    public int getMaximumBitmapWidth();
    public long getNativeCanvasWrapper();
    public int getSaveCount();
    public int getWidth();
    public void insertInorderBarrier();
    public void insertReorderBarrier();
    public boolean isHardwareAccelerated();
    public boolean isOpaque();
    public boolean isRecordingFor(java.lang.Object);
    public boolean quickReject(android.graphics.RectF, android.graphics.Canvas$EdgeType);
    public boolean quickReject(android.graphics.Path, android.graphics.Canvas$EdgeType);
    public boolean quickReject(float, float, float, float, android.graphics.Canvas$EdgeType);
    public void release();
    public void restore();
    public void restoreToCount(int);
    public void rotate(float);
    public void rotate(float, float, float);
    public int save();
    public int save(int);
    public int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
    public int saveLayer(android.graphics.RectF, android.graphics.Paint);
    public int saveLayer(float, float, float, float, android.graphics.Paint, int);
    public int saveLayer(float, float, float, float, android.graphics.Paint);
    public int saveLayerAlpha(android.graphics.RectF, int, int);
    public int saveLayerAlpha(android.graphics.RectF, int);
    public int saveLayerAlpha(float, float, float, float, int, int);
    public int saveLayerAlpha(float, float, float, float, int);
    public int saveUnclippedLayer(int, int, int, int);
    public void scale(float, float);
    public void scale(float, float, float, float);
    public void setBitmap(android.graphics.Bitmap);
    public static void setCompatibilityVersion(int);
    public void setDensity(int);
    public void setDrawFilter(android.graphics.DrawFilter);
    public void setMatrix(android.graphics.Matrix);
    public void setScreenDensity(int);
    public void skew(float, float);
    public void translate(float, float);


    public static int ALL_SAVE_FLAG;
    public static int CLIP_SAVE_FLAG;
    public static int CLIP_TO_LAYER_SAVE_FLAG;
    public static int FULL_COLOR_LAYER_SAVE_FLAG;
    public static int HAS_ALPHA_LAYER_SAVE_FLAG;
    public static int MATRIX_SAVE_FLAG;
    public static boolean sCompatibilityRestore;
    public static boolean sCompatibilitySetBitmap;
}

-keep class android.graphics.Canvas$EdgeType {

    public static android.graphics.Canvas$EdgeType valueOf(java.lang.String);
    public static android.graphics.Canvas$EdgeType[] values();

    public static android.graphics.Canvas$EdgeType AA;
    public static android.graphics.Canvas$EdgeType BW;

    public int nativeInt;
}

-keep class android.graphics.Canvas$VertexMode {

    public static android.graphics.Canvas$VertexMode valueOf(java.lang.String);
    public static android.graphics.Canvas$VertexMode[] values();

    public static android.graphics.Canvas$VertexMode TRIANGLES;
    public static android.graphics.Canvas$VertexMode TRIANGLE_FAN;
    public static android.graphics.Canvas$VertexMode TRIANGLE_STRIP;

    public int nativeInt;
}

-keep class android.graphics.CanvasProperty {

    public static android.graphics.CanvasProperty createFloat(float);
    public static android.graphics.CanvasProperty createPaint(android.graphics.Paint);
    public long getNativeContainer();


}

-keep class android.graphics.ColorFilter {
    <init>();

    public long getNativeInstance();


}

-keep class android.graphics.ColorSpace {

    public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[]);
    public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[], android.graphics.ColorSpace$Adaptation);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace, android.graphics.ColorSpace$RenderIntent);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace);
    public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace$RenderIntent);
    public static android.graphics.ColorSpace$Renderer createRenderer();
    public boolean equals(java.lang.Object);
    public float[] fromXyz(float, float, float);
    public abstract float[] fromXyz(float[]);
    public static android.graphics.ColorSpace get(android.graphics.ColorSpace$Named);
    public int getComponentCount();
    public int getId();
    public abstract float getMaxValue(int);
    public abstract float getMinValue(int);
    public android.graphics.ColorSpace$Model getModel();
    public java.lang.String getName();
    public int hashCode();
    public boolean isSrgb();
    public abstract boolean isWideGamut();
    public static android.graphics.ColorSpace match(float[], android.graphics.ColorSpace$Rgb$TransferParameters);
    public java.lang.String toString();
    public float[] toXyz(float, float, float);
    public abstract float[] toXyz(float[]);


    public static float[] ILLUMINANT_A;
    public static float[] ILLUMINANT_B;
    public static float[] ILLUMINANT_C;
    public static float[] ILLUMINANT_D50;
    public static float[] ILLUMINANT_D55;
    public static float[] ILLUMINANT_D60;
    public static float[] ILLUMINANT_D65;
    public static float[] ILLUMINANT_D75;
    public static float[] ILLUMINANT_E;
    public static int MAX_ID;
    public static int MIN_ID;
}

-keep class android.graphics.ColorSpace$Adaptation {

    public static android.graphics.ColorSpace$Adaptation valueOf(java.lang.String);
    public static android.graphics.ColorSpace$Adaptation[] values();

    public static android.graphics.ColorSpace$Adaptation BRADFORD;
    public static android.graphics.ColorSpace$Adaptation CIECAT02;
    public static android.graphics.ColorSpace$Adaptation VON_KRIES;

}

-keep class android.graphics.ColorSpace$Connector {

    public android.graphics.ColorSpace getDestination();
    public android.graphics.ColorSpace$RenderIntent getRenderIntent();
    public android.graphics.ColorSpace getSource();
    public float[] transform(float, float, float);
    public float[] transform(float[]);


}

-keep class android.graphics.ColorSpace$Model {

    public int getComponentCount();
    public static android.graphics.ColorSpace$Model valueOf(java.lang.String);
    public static android.graphics.ColorSpace$Model[] values();

    public static android.graphics.ColorSpace$Model CMYK;
    public static android.graphics.ColorSpace$Model LAB;
    public static android.graphics.ColorSpace$Model RGB;
    public static android.graphics.ColorSpace$Model XYZ;

}

-keep class android.graphics.ColorSpace$Named {

    public static android.graphics.ColorSpace$Named valueOf(java.lang.String);
    public static android.graphics.ColorSpace$Named[] values();

    public static android.graphics.ColorSpace$Named ACES;
    public static android.graphics.ColorSpace$Named ACESCG;
    public static android.graphics.ColorSpace$Named ADOBE_RGB;
    public static android.graphics.ColorSpace$Named BT2020;
    public static android.graphics.ColorSpace$Named BT709;
    public static android.graphics.ColorSpace$Named CIE_LAB;
    public static android.graphics.ColorSpace$Named CIE_XYZ;
    public static android.graphics.ColorSpace$Named DCI_P3;
    public static android.graphics.ColorSpace$Named DISPLAY_P3;
    public static android.graphics.ColorSpace$Named EXTENDED_SRGB;
    public static android.graphics.ColorSpace$Named LINEAR_EXTENDED_SRGB;
    public static android.graphics.ColorSpace$Named LINEAR_SRGB;
    public static android.graphics.ColorSpace$Named NTSC_1953;
    public static android.graphics.ColorSpace$Named PRO_PHOTO_RGB;
    public static android.graphics.ColorSpace$Named SMPTE_C;
    public static android.graphics.ColorSpace$Named SRGB;

}

-keep class android.graphics.ColorSpace$RenderIntent {

    public static android.graphics.ColorSpace$RenderIntent valueOf(java.lang.String);
    public static android.graphics.ColorSpace$RenderIntent[] values();

    public static android.graphics.ColorSpace$RenderIntent ABSOLUTE;
    public static android.graphics.ColorSpace$RenderIntent PERCEPTUAL;
    public static android.graphics.ColorSpace$RenderIntent RELATIVE;
    public static android.graphics.ColorSpace$RenderIntent SATURATION;

}

-keep class android.graphics.ColorSpace$Renderer {

    public android.graphics.ColorSpace$Renderer add(android.graphics.ColorSpace, int);
    public android.graphics.ColorSpace$Renderer add(android.graphics.ColorSpace, float, float, float, int);
    public android.graphics.ColorSpace$Renderer clip(boolean);
    public android.graphics.Bitmap render();
    public android.graphics.ColorSpace$Renderer showWhitePoint(boolean);
    public android.graphics.ColorSpace$Renderer size(int);
    public android.graphics.ColorSpace$Renderer uniformChromaticityScale(boolean);


}

-keep class android.graphics.ColorSpace$Rgb {
    <init>(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator);
    <init>(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float);
    <init>(java.lang.String, float[], android.graphics.ColorSpace$Rgb$TransferParameters);
    <init>(java.lang.String, float[], float[], android.graphics.ColorSpace$Rgb$TransferParameters);
    <init>(java.lang.String, float[], double);
    <init>(java.lang.String, float[], float[], double);

    public boolean equals(java.lang.Object);
    public float[] fromLinear(float, float, float);
    public float[] fromLinear(float[]);
    public float[] fromXyz(float[]);
    public java.util.function.DoubleUnaryOperator getEotf();
    public float[] getInverseTransform(float[]);
    public float[] getInverseTransform();
    public float getMaxValue(int);
    public float getMinValue(int);
    public java.util.function.DoubleUnaryOperator getOetf();
    public float[] getPrimaries(float[]);
    public float[] getPrimaries();
    public android.graphics.ColorSpace$Rgb$TransferParameters getTransferParameters();
    public float[] getTransform(float[]);
    public float[] getTransform();
    public float[] getWhitePoint(float[]);
    public float[] getWhitePoint();
    public int hashCode();
    public boolean isSrgb();
    public boolean isWideGamut();
    public float[] toLinear(float, float, float);
    public float[] toLinear(float[]);
    public float[] toXyz(float[]);


}

-keep class android.graphics.ColorSpace$Rgb$TransferParameters {
    <init>(double, double, double, double, double);
    <init>(double, double, double, double, double, double, double);

    public boolean equals(java.lang.Object);
    public int hashCode();


    public double a;
    public double b;
    public double c;
    public double d;
    public double e;
    public double f;
    public double g;
}

-keep class android.graphics.DrawFilter {
    <init>();

    protected void finalize();


    public long mNativeInt;
}

-keep class android.graphics.FontFamily {
    <init>();
    <init>(java.lang.String[], int);

    public void abortCreation();
    public boolean addFont(java.lang.String, int, android.graphics.fonts.FontVariationAxis[], int, int);
    public boolean addFontFromAssetManager(android.content.res.AssetManager, java.lang.String, int, boolean, int, int, int, android.graphics.fonts.FontVariationAxis[]);
    public boolean addFontFromBuffer(java.nio.ByteBuffer, int, android.graphics.fonts.FontVariationAxis[], int, int);
    public boolean freeze();


    public long mNativePtr;
}

-keep class android.graphics.GraphicBuffer {

    public static android.graphics.GraphicBuffer create(int, int, int, int);
    public static android.graphics.GraphicBuffer createFromExisting(int, int, int, int, long);
    public int describeContents();
    public void destroy();
    protected void finalize();
    public int getFormat();
    public int getHeight();
    public int getUsage();
    public int getWidth();
    public boolean isDestroyed();
    public android.graphics.Canvas lockCanvas();
    public android.graphics.Canvas lockCanvas(android.graphics.Rect);
    public void unlockCanvasAndPost(android.graphics.Canvas);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int USAGE_HW_2D;
    public static int USAGE_HW_COMPOSER;
    public static int USAGE_HW_MASK;
    public static int USAGE_HW_RENDER;
    public static int USAGE_HW_TEXTURE;
    public static int USAGE_HW_VIDEO_ENCODER;
    public static int USAGE_PROTECTED;
    public static int USAGE_SOFTWARE_MASK;
    public static int USAGE_SW_READ_MASK;
    public static int USAGE_SW_READ_NEVER;
    public static int USAGE_SW_READ_OFTEN;
    public static int USAGE_SW_READ_RARELY;
    public static int USAGE_SW_WRITE_MASK;
    public static int USAGE_SW_WRITE_NEVER;
    public static int USAGE_SW_WRITE_OFTEN;
    public static int USAGE_SW_WRITE_RARELY;
}

-keep class android.graphics.Insets {

    public boolean equals(java.lang.Object);
    public int hashCode();
    public static android.graphics.Insets of(int, int, int, int);
    public static android.graphics.Insets of(android.graphics.Rect);
    public java.lang.String toString();


    public static android.graphics.Insets NONE;
    public int bottom;
    public int left;
    public int right;
    public int top;
}

-keep class android.graphics.MaskFilter {
    <init>();

    protected void finalize();


}

-keep class android.graphics.Matrix {
    <init>();
    <init>(android.graphics.Matrix);

    public boolean equals(java.lang.Object);
    public void getValues(float[]);
    public int hashCode();
    public boolean invert(android.graphics.Matrix);
    public boolean isAffine();
    public boolean isIdentity();
    public void mapPoints(float[], int, float[], int, int);
    public void mapPoints(float[], float[]);
    public void mapPoints(float[]);
    public float mapRadius(float);
    public boolean mapRect(android.graphics.RectF, android.graphics.RectF);
    public boolean mapRect(android.graphics.RectF);
    public void mapVectors(float[], int, float[], int, int);
    public void mapVectors(float[], float[]);
    public void mapVectors(float[]);
    public long ni();
    public boolean postConcat(android.graphics.Matrix);
    public boolean postRotate(float, float, float);
    public boolean postRotate(float);
    public boolean postScale(float, float, float, float);
    public boolean postScale(float, float);
    public boolean postSkew(float, float, float, float);
    public boolean postSkew(float, float);
    public boolean postTranslate(float, float);
    public boolean preConcat(android.graphics.Matrix);
    public boolean preRotate(float, float, float);
    public boolean preRotate(float);
    public boolean preScale(float, float, float, float);
    public boolean preScale(float, float);
    public boolean preSkew(float, float, float, float);
    public boolean preSkew(float, float);
    public boolean preTranslate(float, float);
    public void printShortString(java.io.PrintWriter);
    public boolean rectStaysRect();
    public void reset();
    public void set(android.graphics.Matrix);
    public boolean setConcat(android.graphics.Matrix, android.graphics.Matrix);
    public boolean setPolyToPoly(float[], int, float[], int, int);
    public boolean setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix$ScaleToFit);
    public void setRotate(float, float, float);
    public void setRotate(float);
    public void setScale(float, float, float, float);
    public void setScale(float, float);
    public void setSinCos(float, float, float, float);
    public void setSinCos(float, float);
    public void setSkew(float, float, float, float);
    public void setSkew(float, float);
    public void setTranslate(float, float);
    public void setValues(float[]);
    public java.lang.String toShortString();
    public void toShortString(java.lang.StringBuilder);
    public java.lang.String toString();


    public static android.graphics.Matrix IDENTITY_MATRIX;
    public static int MPERSP_0;
    public static int MPERSP_1;
    public static int MPERSP_2;
    public static int MSCALE_X;
    public static int MSCALE_Y;
    public static int MSKEW_X;
    public static int MSKEW_Y;
    public static int MTRANS_X;
    public static int MTRANS_Y;
    public long native_instance;
}

-keep class android.graphics.Matrix$ScaleToFit {

    public static android.graphics.Matrix$ScaleToFit valueOf(java.lang.String);
    public static android.graphics.Matrix$ScaleToFit[] values();

    public static android.graphics.Matrix$ScaleToFit CENTER;
    public static android.graphics.Matrix$ScaleToFit END;
    public static android.graphics.Matrix$ScaleToFit FILL;
    public static android.graphics.Matrix$ScaleToFit START;

}

-keep class android.graphics.Movie {

    public static android.graphics.Movie decodeByteArray(byte[], int, int);
    public static android.graphics.Movie decodeFile(java.lang.String);
    public static android.graphics.Movie decodeStream(java.io.InputStream);
    public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
    public void draw(android.graphics.Canvas, float, float);
    public int duration();
    protected void finalize();
    public int height();
    public boolean isOpaque();
    public boolean setTime(int);
    public int width();


}

-keep class android.graphics.NinePatch {
    <init>(android.graphics.Bitmap, byte[]);
    <init>(android.graphics.Bitmap, byte[], java.lang.String);
    <init>(android.graphics.NinePatch);

    public void draw(android.graphics.Canvas, android.graphics.RectF);
    public void draw(android.graphics.Canvas, android.graphics.Rect);
    public void draw(android.graphics.Canvas, android.graphics.Rect, android.graphics.Paint);
    protected void finalize();
    public android.graphics.Bitmap getBitmap();
    public int getDensity();
    public int getHeight();
    public java.lang.String getName();
    public android.graphics.Paint getPaint();
    public android.graphics.Region getTransparentRegion(android.graphics.Rect);
    public int getWidth();
    public boolean hasAlpha();
    public static boolean isNinePatchChunk(byte[]);
    public void setPaint(android.graphics.Paint);


    public long mNativeChunk;
}

-keep class android.graphics.NinePatch$InsetStruct {

    public static android.graphics.Rect scaleInsets(int, int, int, int, float);


    public android.graphics.Rect opticalRect;
    public float outlineAlpha;
    public float outlineRadius;
    public android.graphics.Rect outlineRect;
}

-keep class android.graphics.Outline {
    <init>();
    <init>(android.graphics.Outline);

    public boolean canClip();
    public float getAlpha();
    public float getRadius();
    public boolean getRect(android.graphics.Rect);
    public boolean isEmpty();
    public void offset(int, int);
    public void set(android.graphics.Outline);
    public void setAlpha(float);
    public void setConvexPath(android.graphics.Path);
    public void setEmpty();
    public void setOval(int, int, int, int);
    public void setOval(android.graphics.Rect);
    public void setRect(int, int, int, int);
    public void setRect(android.graphics.Rect);
    public void setRoundRect(int, int, int, int, float);
    public void setRoundRect(android.graphics.Rect, float);


    public static int MODE_CONVEX_PATH;
    public static int MODE_EMPTY;
    public static int MODE_ROUND_RECT;
    public float mAlpha;
    public int mMode;
    public android.graphics.Path mPath;
    public float mRadius;
    public android.graphics.Rect mRect;
}

-keep class android.graphics.Paint {
    <init>();
    <init>(int);
    <init>(android.graphics.Paint);

    public float ascent();
    public int breakText(char[], int, int, float, float[]);
    public int breakText(java.lang.CharSequence, int, int, boolean, float, float[]);
    public int breakText(java.lang.String, boolean, float, float[]);
    public void clearShadowLayer();
    public float descent();
    public boolean equalsForTextMeasurement(android.graphics.Paint);
    public int getAlpha();
    public int getBidiFlags();
    public int getColor();
    public android.graphics.ColorFilter getColorFilter();
    public boolean getFillPath(android.graphics.Path, android.graphics.Path);
    public int getFlags();
    public java.lang.String getFontFeatureSettings();
    public float getFontMetrics(android.graphics.Paint$FontMetrics);
    public android.graphics.Paint$FontMetrics getFontMetrics();
    public int getFontMetricsInt(android.graphics.Paint$FontMetricsInt);
    public android.graphics.Paint$FontMetricsInt getFontMetricsInt();
    public float getFontSpacing();
    public java.lang.String getFontVariationSettings();
    public int getHinting();
    public int getHyphenEdit();
    public float getLetterSpacing();
    public android.graphics.MaskFilter getMaskFilter();
    public long getNativeInstance();
    public int getOffsetForAdvance(char[], int, int, int, int, boolean, float);
    public int getOffsetForAdvance(java.lang.CharSequence, int, int, int, int, boolean, float);
    public android.graphics.PathEffect getPathEffect();
    public android.graphics.Rasterizer getRasterizer();
    public float getRunAdvance(char[], int, int, int, int, boolean, int);
    public float getRunAdvance(java.lang.CharSequence, int, int, int, int, boolean, int);
    public android.graphics.Shader getShader();
    public float getStrikeThruPosition();
    public float getStrikeThruThickness();
    public android.graphics.Paint$Cap getStrokeCap();
    public android.graphics.Paint$Join getStrokeJoin();
    public float getStrokeMiter();
    public float getStrokeWidth();
    public android.graphics.Paint$Style getStyle();
    public android.graphics.Paint$Align getTextAlign();
    public void getTextBounds(java.lang.String, int, int, android.graphics.Rect);
    public void getTextBounds(java.lang.CharSequence, int, int, android.graphics.Rect);
    public void getTextBounds(char[], int, int, android.graphics.Rect);
    public java.util.Locale getTextLocale();
    public android.os.LocaleList getTextLocales();
    public void getTextPath(char[], int, int, float, float, android.graphics.Path);
    public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path);
    public float getTextRunAdvances(char[], int, int, int, int, boolean, float[], int);
    public float getTextRunAdvances(java.lang.CharSequence, int, int, int, int, boolean, float[], int);
    public float getTextRunAdvances(java.lang.String, int, int, int, int, boolean, float[], int);
    public int getTextRunCursor(char[], int, int, int, int, int);
    public int getTextRunCursor(java.lang.CharSequence, int, int, int, int, int);
    public int getTextRunCursor(java.lang.String, int, int, int, int, int);
    public float getTextScaleX();
    public float getTextSize();
    public float getTextSkewX();
    public int getTextWidths(char[], int, int, float[]);
    public int getTextWidths(java.lang.CharSequence, int, int, float[]);
    public int getTextWidths(java.lang.String, int, int, float[]);
    public int getTextWidths(java.lang.String, float[]);
    public android.graphics.Typeface getTypeface();
    public float getUnderlinePosition();
    public float getUnderlineThickness();
    public float getWordSpacing();
    public android.graphics.Xfermode getXfermode();
    public boolean hasEqualAttributes(android.graphics.Paint);
    public boolean hasGlyph(java.lang.String);
    public boolean hasShadowLayer();
    public boolean isAntiAlias();
    public boolean isDither();
    public boolean isElegantTextHeight();
    public boolean isFakeBoldText();
    public boolean isFilterBitmap();
    public boolean isLinearText();
    public boolean isStrikeThruText();
    public boolean isSubpixelText();
    public boolean isUnderlineText();
    public float measureText(char[], int, int);
    public float measureText(java.lang.String, int, int);
    public float measureText(java.lang.String);
    public float measureText(java.lang.CharSequence, int, int);
    public void reset();
    public void set(android.graphics.Paint);
    public void setARGB(int, int, int, int);
    public void setAlpha(int);
    public void setAntiAlias(boolean);
    public void setBidiFlags(int);
    public void setColor(int);
    public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
    public void setCompatibilityScaling(float);
    public void setDither(boolean);
    public void setElegantTextHeight(boolean);
    public void setFakeBoldText(boolean);
    public void setFilterBitmap(boolean);
    public void setFlags(int);
    public void setFontFeatureSettings(java.lang.String);
    public boolean setFontVariationSettings(java.lang.String);
    public void setHinting(int);
    public void setHyphenEdit(int);
    public void setLetterSpacing(float);
    public void setLinearText(boolean);
    public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
    public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
    public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
    public android.graphics.Shader setShader(android.graphics.Shader);
    public void setShadowLayer(float, float, float, int);
    public void setStrikeThruText(boolean);
    public void setStrokeCap(android.graphics.Paint$Cap);
    public void setStrokeJoin(android.graphics.Paint$Join);
    public void setStrokeMiter(float);
    public void setStrokeWidth(float);
    public void setStyle(android.graphics.Paint$Style);
    public void setSubpixelText(boolean);
    public void setTextAlign(android.graphics.Paint$Align);
    public void setTextLocale(java.util.Locale);
    public void setTextLocales(android.os.LocaleList);
    public void setTextScaleX(float);
    public void setTextSize(float);
    public void setTextSkewX(float);
    public android.graphics.Typeface setTypeface(android.graphics.Typeface);
    public void setUnderlineText(boolean);
    public void setWordSpacing(float);
    public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);


    public static int ANTI_ALIAS_FLAG;
    public static int AUTO_HINTING_TEXT_FLAG;
    public static int BIDI_DEFAULT_LTR;
    public static int BIDI_DEFAULT_RTL;
    public static int BIDI_FORCE_LTR;
    public static int BIDI_FORCE_RTL;
    public static int BIDI_LTR;
    public static int BIDI_RTL;
    public static int CURSOR_AFTER;
    public static int CURSOR_AT;
    public static int CURSOR_AT_OR_AFTER;
    public static int CURSOR_AT_OR_BEFORE;
    public static int CURSOR_BEFORE;
    public static int DEV_KERN_TEXT_FLAG;
    public static int DIRECTION_LTR;
    public static int DIRECTION_RTL;
    public static int DITHER_FLAG;
    public static int EMBEDDED_BITMAP_TEXT_FLAG;
    public static int FAKE_BOLD_TEXT_FLAG;
    public static int FILTER_BITMAP_FLAG;
    public static int HINTING_OFF;
    public static int HINTING_ON;
    public static int HYPHENEDIT_MASK_END_OF_LINE;
    public static int HYPHENEDIT_MASK_START_OF_LINE;
    public static int LCD_RENDER_TEXT_FLAG;
    public static int LINEAR_TEXT_FLAG;
    public static int STRIKE_THRU_TEXT_FLAG;
    public static int SUBPIXEL_TEXT_FLAG;
    public static int UNDERLINE_TEXT_FLAG;
    public static int VERTICAL_TEXT_FLAG;
    public int mBidiFlags;
}

-keep class android.graphics.Paint$Align {

    public static android.graphics.Paint$Align valueOf(java.lang.String);
    public static android.graphics.Paint$Align[] values();

    public static android.graphics.Paint$Align CENTER;
    public static android.graphics.Paint$Align LEFT;
    public static android.graphics.Paint$Align RIGHT;

}

-keep class android.graphics.Paint$Cap {

    public static android.graphics.Paint$Cap valueOf(java.lang.String);
    public static android.graphics.Paint$Cap[] values();

    public static android.graphics.Paint$Cap BUTT;
    public static android.graphics.Paint$Cap ROUND;
    public static android.graphics.Paint$Cap SQUARE;

}

-keep class android.graphics.Paint$FontMetrics {
    <init>();



    public float ascent;
    public float bottom;
    public float descent;
    public float leading;
    public float top;
}

-keep class android.graphics.Paint$FontMetricsInt {
    <init>();

    public java.lang.String toString();


    public int ascent;
    public int bottom;
    public int descent;
    public int leading;
    public int top;
}

-keep class android.graphics.Paint$Join {

    public static android.graphics.Paint$Join valueOf(java.lang.String);
    public static android.graphics.Paint$Join[] values();

    public static android.graphics.Paint$Join BEVEL;
    public static android.graphics.Paint$Join MITER;
    public static android.graphics.Paint$Join ROUND;

}

-keep class android.graphics.Paint$Style {

    public static android.graphics.Paint$Style valueOf(java.lang.String);
    public static android.graphics.Paint$Style[] values();

    public static android.graphics.Paint$Style FILL;
    public static android.graphics.Paint$Style FILL_AND_STROKE;
    public static android.graphics.Paint$Style STROKE;

}

-keep class android.graphics.Path {
    <init>();
    <init>(android.graphics.Path);

    public void addArc(android.graphics.RectF, float, float);
    public void addArc(float, float, float, float, float, float);
    public void addCircle(float, float, float, android.graphics.Path$Direction);
    public void addOval(android.graphics.RectF, android.graphics.Path$Direction);
    public void addOval(float, float, float, float, android.graphics.Path$Direction);
    public void addPath(android.graphics.Path, float, float);
    public void addPath(android.graphics.Path);
    public void addPath(android.graphics.Path, android.graphics.Matrix);
    public void addRect(android.graphics.RectF, android.graphics.Path$Direction);
    public void addRect(float, float, float, float, android.graphics.Path$Direction);
    public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path$Direction);
    public void addRoundRect(float, float, float, float, float, float, android.graphics.Path$Direction);
    public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path$Direction);
    public void addRoundRect(float, float, float, float, float[], android.graphics.Path$Direction);
    public float[] approximate(float);
    public void arcTo(android.graphics.RectF, float, float, boolean);
    public void arcTo(android.graphics.RectF, float, float);
    public void arcTo(float, float, float, float, float, float, boolean);
    public void close();
    public void computeBounds(android.graphics.RectF, boolean);
    public void cubicTo(float, float, float, float, float, float);
    public android.graphics.Path$FillType getFillType();
    public void incReserve(int);
    public boolean isConvex();
    public boolean isEmpty();
    public boolean isInverseFillType();
    public boolean isRect(android.graphics.RectF);
    public void lineTo(float, float);
    public void moveTo(float, float);
    public void offset(float, float, android.graphics.Path);
    public void offset(float, float);
    public boolean op(android.graphics.Path, android.graphics.Path$Op);
    public boolean op(android.graphics.Path, android.graphics.Path, android.graphics.Path$Op);
    public void quadTo(float, float, float, float);
    public void rCubicTo(float, float, float, float, float, float);
    public void rLineTo(float, float);
    public void rMoveTo(float, float);
    public void rQuadTo(float, float, float, float);
    public long readOnlyNI();
    public void reset();
    public void rewind();
    public void set(android.graphics.Path);
    public void setFillType(android.graphics.Path$FillType);
    public void setLastPoint(float, float);
    public void toggleInverseFillType();
    public void transform(android.graphics.Matrix, android.graphics.Path);
    public void transform(android.graphics.Matrix);


    public boolean isSimplePath;
    public long mNativePath;
    public android.graphics.Region rects;
}

-keep class android.graphics.Path$Direction {

    public static android.graphics.Path$Direction valueOf(java.lang.String);
    public static android.graphics.Path$Direction[] values();

    public static android.graphics.Path$Direction CCW;
    public static android.graphics.Path$Direction CW;

}

-keep class android.graphics.Path$FillType {

    public static android.graphics.Path$FillType valueOf(java.lang.String);
    public static android.graphics.Path$FillType[] values();

    public static android.graphics.Path$FillType EVEN_ODD;
    public static android.graphics.Path$FillType INVERSE_EVEN_ODD;
    public static android.graphics.Path$FillType INVERSE_WINDING;
    public static android.graphics.Path$FillType WINDING;

}

-keep class android.graphics.Path$Op {

    public static android.graphics.Path$Op valueOf(java.lang.String);
    public static android.graphics.Path$Op[] values();

    public static android.graphics.Path$Op DIFFERENCE;
    public static android.graphics.Path$Op INTERSECT;
    public static android.graphics.Path$Op REVERSE_DIFFERENCE;
    public static android.graphics.Path$Op UNION;
    public static android.graphics.Path$Op XOR;

}

-keep class android.graphics.PathEffect {
    <init>();

    protected void finalize();


}

-keep class android.graphics.Picture {
    <init>();
    <init>(android.graphics.Picture);

    public android.graphics.Canvas beginRecording(int, int);
    public static android.graphics.Picture createFromStream(java.io.InputStream);
    public void draw(android.graphics.Canvas);
    public void endRecording();
    protected void finalize();
    public int getHeight();
    public int getWidth();
    public boolean requiresHardwareAcceleration();
    public void writeToStream(java.io.OutputStream);


}

-keep class android.graphics.Point {
    <init>();
    <init>(int, int);
    <init>(android.graphics.Point);

    public int describeContents();
    public boolean equals(int, int);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void negate();
    public void offset(int, int);
    public void printShortString(java.io.PrintWriter);
    public void readFromParcel(android.os.Parcel);
    public void set(int, int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public int x;
    public int y;
}

-keep class android.graphics.PointF {
    <init>();
    <init>(float, float);
    <init>(android.graphics.Point);

    public int describeContents();
    public boolean equals(float, float);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public float length();
    public static float length(float, float);
    public void negate();
    public void offset(float, float);
    public void readFromParcel(android.os.Parcel);
    public void set(float, float);
    public void set(android.graphics.PointF);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float x;
    public float y;
}

-keep class android.graphics.PorterDuff {
    <init>();

    public static android.graphics.PorterDuff$Mode intToMode(int);
    public static int modeToInt(android.graphics.PorterDuff$Mode);


}

-keep class android.graphics.PorterDuff$Mode {

    public static android.graphics.PorterDuff$Mode valueOf(java.lang.String);
    public static android.graphics.PorterDuff$Mode[] values();

    public static android.graphics.PorterDuff$Mode ADD;
    public static android.graphics.PorterDuff$Mode CLEAR;
    public static android.graphics.PorterDuff$Mode DARKEN;
    public static android.graphics.PorterDuff$Mode DST;
    public static android.graphics.PorterDuff$Mode DST_ATOP;
    public static android.graphics.PorterDuff$Mode DST_IN;
    public static android.graphics.PorterDuff$Mode DST_OUT;
    public static android.graphics.PorterDuff$Mode DST_OVER;
    public static android.graphics.PorterDuff$Mode LIGHTEN;
    public static android.graphics.PorterDuff$Mode MULTIPLY;
    public static android.graphics.PorterDuff$Mode OVERLAY;
    public static android.graphics.PorterDuff$Mode SCREEN;
    public static android.graphics.PorterDuff$Mode SRC;
    public static android.graphics.PorterDuff$Mode SRC_ATOP;
    public static android.graphics.PorterDuff$Mode SRC_IN;
    public static android.graphics.PorterDuff$Mode SRC_OUT;
    public static android.graphics.PorterDuff$Mode SRC_OVER;
    public static android.graphics.PorterDuff$Mode XOR;

    public int nativeInt;
}

-keep class android.graphics.Rasterizer {
    <init>();

    protected void finalize();


}

-keep class android.graphics.Rect {
    <init>();
    <init>(int, int, int, int);
    <init>(android.graphics.Rect);

    public int centerX();
    public int centerY();
    public boolean contains(int, int);
    public boolean contains(int, int, int, int);
    public boolean contains(android.graphics.Rect);
    public static android.graphics.Rect copyOrNull(android.graphics.Rect);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public float exactCenterX();
    public float exactCenterY();
    public java.lang.String flattenToString();
    public int hashCode();
    public int height();
    public void inset(int, int);
    public void inset(android.graphics.Rect);
    public void inset(int, int, int, int);
    public boolean intersect(int, int, int, int);
    public boolean intersect(android.graphics.Rect);
    public void intersectUnchecked(android.graphics.Rect);
    public boolean intersects(int, int, int, int);
    public static boolean intersects(android.graphics.Rect, android.graphics.Rect);
    public boolean isEmpty();
    public void offset(int, int);
    public void offsetTo(int, int);
    public void printShortString(java.io.PrintWriter);
    public void readFromParcel(android.os.Parcel);
    public void scale(float);
    public void set(int, int, int, int);
    public void set(android.graphics.Rect);
    public void setEmpty();
    public boolean setIntersect(android.graphics.Rect, android.graphics.Rect);
    public void sort();
    public java.lang.String toShortString();
    public java.lang.String toShortString(java.lang.StringBuilder);
    public java.lang.String toString();
    public static android.graphics.Rect unflattenFromString(java.lang.String);
    public void union(int, int, int, int);
    public void union(android.graphics.Rect);
    public void union(int, int);
    public int width();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public int bottom;
    public int left;
    public int right;
    public int top;
}

-keep class android.graphics.RectF {
    <init>();
    <init>(float, float, float, float);
    <init>(android.graphics.RectF);
    <init>(android.graphics.Rect);

    public float centerX();
    public float centerY();
    public boolean contains(float, float);
    public boolean contains(float, float, float, float);
    public boolean contains(android.graphics.RectF);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public float height();
    public void inset(float, float);
    public boolean intersect(float, float, float, float);
    public boolean intersect(android.graphics.RectF);
    public boolean intersects(float, float, float, float);
    public static boolean intersects(android.graphics.RectF, android.graphics.RectF);
    public boolean isEmpty();
    public void offset(float, float);
    public void offsetTo(float, float);
    public void printShortString(java.io.PrintWriter);
    public void readFromParcel(android.os.Parcel);
    public void round(android.graphics.Rect);
    public void roundOut(android.graphics.Rect);
    public void scale(float);
    public void set(float, float, float, float);
    public void set(android.graphics.RectF);
    public void set(android.graphics.Rect);
    public void setEmpty();
    public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
    public void sort();
    public java.lang.String toShortString();
    public java.lang.String toShortString(java.lang.StringBuilder);
    public java.lang.String toString();
    public void union(float, float, float, float);
    public void union(android.graphics.RectF);
    public void union(float, float);
    public float width();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float bottom;
    public float left;
    public float right;
    public float top;
}

-keep class android.graphics.Region {
    <init>();
    <init>(android.graphics.Region);
    <init>(android.graphics.Rect);
    <init>(int, int, int, int);

    public boolean contains(int, int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    protected void finalize();
    public android.graphics.Path getBoundaryPath();
    public boolean getBoundaryPath(android.graphics.Path);
    public android.graphics.Rect getBounds();
    public boolean getBounds(android.graphics.Rect);
    public boolean isComplex();
    public boolean isEmpty();
    public boolean isRect();
    public static android.graphics.Region obtain();
    public static android.graphics.Region obtain(android.graphics.Region);
    public boolean op(android.graphics.Rect, android.graphics.Region$Op);
    public boolean op(int, int, int, int, android.graphics.Region$Op);
    public boolean op(android.graphics.Region, android.graphics.Region$Op);
    public boolean op(android.graphics.Rect, android.graphics.Region, android.graphics.Region$Op);
    public boolean op(android.graphics.Region, android.graphics.Region, android.graphics.Region$Op);
    public boolean quickContains(android.graphics.Rect);
    public boolean quickContains(int, int, int, int);
    public boolean quickReject(android.graphics.Rect);
    public boolean quickReject(int, int, int, int);
    public boolean quickReject(android.graphics.Region);
    public void recycle();
    public void scale(float);
    public void scale(float, android.graphics.Region);
    public boolean set(android.graphics.Region);
    public boolean set(android.graphics.Rect);
    public boolean set(int, int, int, int);
    public void setEmpty();
    public boolean setPath(android.graphics.Path, android.graphics.Region);
    public java.lang.String toString();
    public void translate(int, int);
    public void translate(int, int, android.graphics.Region);
    public boolean union(android.graphics.Rect);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public long mNativeRegion;
}

-keep class android.graphics.Region$Op {

    public static android.graphics.Region$Op valueOf(java.lang.String);
    public static android.graphics.Region$Op[] values();

    public static android.graphics.Region$Op DIFFERENCE;
    public static android.graphics.Region$Op INTERSECT;
    public static android.graphics.Region$Op REPLACE;
    public static android.graphics.Region$Op REVERSE_DIFFERENCE;
    public static android.graphics.Region$Op UNION;
    public static android.graphics.Region$Op XOR;

    public int nativeInt;
}

-keep class android.graphics.Shader {
    <init>();

    protected android.graphics.Shader copy();
    protected void copyLocalMatrix(android.graphics.Shader);
    protected void discardNativeInstance();
    public boolean getLocalMatrix(android.graphics.Matrix);
    public long getNativeInstance();
    public void setLocalMatrix(android.graphics.Matrix);
    protected void verifyNativeInstance();


}

-keep class android.graphics.SurfaceTexture {
    <init>(int);
    <init>(int, boolean);
    <init>(boolean);

    public void attachToGLContext(int);
    public void detachFromGLContext();
    protected void finalize();
    public long getTimestamp();
    public void getTransformMatrix(float[]);
    public boolean isReleased();
    public boolean isSingleBuffered();
    public void release();
    public void releaseTexImage();
    public void setDefaultBufferSize(int, int);
    public void setOnFrameAvailableListener(android.graphics.SurfaceTexture$OnFrameAvailableListener);
    public void setOnFrameAvailableListener(android.graphics.SurfaceTexture$OnFrameAvailableListener, android.os.Handler);
    public void updateTexImage();


}

-keep class android.graphics.SurfaceTexture$OnFrameAvailableListener {

    public abstract void onFrameAvailable(android.graphics.SurfaceTexture);


}

-keep class android.graphics.Typeface {

    public static void buildSystemFallback(java.lang.String, java.lang.String, android.util.ArrayMap, android.util.ArrayMap);
    public static android.graphics.Typeface create(java.lang.String, int);
    public static android.graphics.Typeface create(android.graphics.Typeface, int);
    public static android.graphics.Typeface create(android.graphics.Typeface, int, boolean);
    public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
    public static android.graphics.Typeface createFromFile(java.io.File);
    public static android.graphics.Typeface createFromFile(java.lang.String);
    public static android.graphics.Typeface createFromResources(android.content.res.AssetManager, java.lang.String, int);
    public static android.graphics.Typeface createFromResources(android.content.res.FontResourcesParser$FamilyResourceEntry, android.content.res.AssetManager, java.lang.String);
    public static android.graphics.Typeface createFromTypefaceWithVariation(android.graphics.Typeface, java.util.List);
    public static android.graphics.Typeface defaultFromStyle(int);
    public boolean equals(java.lang.Object);
    public static android.graphics.Typeface findFromCache(android.content.res.AssetManager, java.lang.String);
    public int getStyle();
    public int getWeight();
    public int hashCode();
    public boolean isBold();
    public boolean isItalic();
    public boolean isSupportedAxes(int);


    public static int BOLD;
    public static int BOLD_ITALIC;
    public static android.graphics.Typeface DEFAULT;
    public static android.graphics.Typeface DEFAULT_BOLD;
    public static int ITALIC;
    public static int MAX_WEIGHT;
    public static android.graphics.Typeface MONOSPACE;
    public static int NORMAL;
    public static int RESOLVE_BY_FONT_TABLE;
    public static android.graphics.Typeface SANS_SERIF;
    public static android.graphics.Typeface SERIF;
    public static int STYLE_MASK;
    public long native_instance;
}

-keep class android.graphics.Xfermode {
    <init>();



}

-keep class android.graphics.drawable.Animatable2 {

    public abstract void clearAnimationCallbacks();
    public abstract void registerAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
    public abstract boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);


}

-keep class android.graphics.drawable.Animatable2$AnimationCallback {
    <init>();

    public void onAnimationEnd(android.graphics.drawable.Drawable);
    public void onAnimationStart(android.graphics.drawable.Drawable);


}

-keep class android.graphics.drawable.AnimatedVectorDrawable {
    <init>();

    public void applyTheme(android.content.res.Resources$Theme);
    public boolean canApplyTheme();
    public boolean canReverse();
    public void clearAnimationCallbacks();
    public void clearMutated();
    public void draw(android.graphics.Canvas);
    public void forceAnimationOnUI();
    public int getAlpha();
    public int getChangingConfigurations();
    public android.graphics.ColorFilter getColorFilter();
    public android.graphics.drawable.Drawable$ConstantState getConstantState();
    public int getIntrinsicHeight();
    public int getIntrinsicWidth();
    public int getOpacity();
    public android.graphics.Insets getOpticalInsets();
    public void getOutline(android.graphics.Outline);
    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public boolean isRunning();
    public boolean isStateful();
    public android.graphics.drawable.Drawable mutate();
    protected void onBoundsChange(android.graphics.Rect);
    public boolean onLayoutDirectionChanged(int);
    protected boolean onLevelChange(int);
    protected boolean onStateChange(int[]);
    public void registerAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
    public void reset();
    public void reverse();
    public void setAlpha(int);
    public void setColorFilter(android.graphics.ColorFilter);
    public void setHotspot(float, float);
    public void setHotspotBounds(int, int, int, int);
    public void setTintList(android.content.res.ColorStateList);
    public void setTintMode(android.graphics.PorterDuff$Mode);
    public boolean setVisible(boolean, boolean);
    public void start();
    public void stop();
    public boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);


}

-keep class android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT {

    public boolean canReverse();
    public void end();
    public long getAnimatorNativePtr();
    public void init(android.animation.AnimatorSet);
    public boolean isInfinite();
    public boolean isRunning();
    public boolean isStarted();
    public void onDraw(android.graphics.Canvas);
    public void pause();
    protected void recordLastSeenTarget(android.view.DisplayListCanvas);
    public void removeListener(android.animation.Animator$AnimatorListener);
    public void reset();
    public void resume();
    public void reverse();
    public void setListener(android.animation.Animator$AnimatorListener);
    public void start();


}

-keep class android.graphics.drawable.Drawable {
    <init>();

    public void applyTheme(android.content.res.Resources$Theme);
    public boolean canApplyTheme();
    public void clearColorFilter();
    public void clearMutated();
    public void copyBounds(android.graphics.Rect);
    public android.graphics.Rect copyBounds();
    public static android.graphics.drawable.Drawable createFromPath(java.lang.String);
    public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String);
    public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String, android.graphics.BitmapFactory$Options);
    public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, java.lang.String);
    public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
    public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
    public static android.graphics.drawable.Drawable createFromXmlForDensity(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, int, android.content.res.Resources$Theme);
    public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public abstract void draw(android.graphics.Canvas);
    public int getAlpha();
    public android.graphics.Rect getBounds();
    public android.graphics.drawable.Drawable$Callback getCallback();
    public int getChangingConfigurations();
    public android.graphics.ColorFilter getColorFilter();
    public android.graphics.drawable.Drawable$ConstantState getConstantState();
    public android.graphics.drawable.Drawable getCurrent();
    public android.graphics.Rect getDirtyBounds();
    public void getHotspotBounds(android.graphics.Rect);
    public int getIntrinsicHeight();
    public int getIntrinsicWidth();
    public int getLayoutDirection();
    public int getLevel();
    public int getMinimumHeight();
    public int getMinimumWidth();
    public abstract int getOpacity();
    public android.graphics.Insets getOpticalInsets();
    public void getOutline(android.graphics.Outline);
    public boolean getPadding(android.graphics.Rect);
    public int[] getState();
    public android.graphics.Region getTransparentRegion();
    public boolean hasFocusStateSpecified();
    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public void invalidateSelf();
    public boolean isAutoMirrored();
    public boolean isFilterBitmap();
    public boolean isProjected();
    public boolean isStateful();
    public boolean isVisible();
    public void jumpToCurrentState();
    public android.graphics.drawable.Drawable mutate();
    protected static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources$Theme, android.util.AttributeSet, int[]);
    protected void onBoundsChange(android.graphics.Rect);
    public boolean onLayoutDirectionChanged(int);
    protected boolean onLevelChange(int);
    protected boolean onStateChange(int[]);
    public static android.graphics.PorterDuff$Mode parseTintMode(int, android.graphics.PorterDuff$Mode);
    public static int resolveOpacity(int, int);
    public void scheduleSelf(java.lang.Runnable, long);
    public abstract void setAlpha(int);
    public void setAutoMirrored(boolean);
    public void setBounds(int, int, int, int);
    public void setBounds(android.graphics.Rect);
    public void setCallback(android.graphics.drawable.Drawable$Callback);
    public void setChangingConfigurations(int);
    public abstract void setColorFilter(android.graphics.ColorFilter);
    public void setColorFilter(int, android.graphics.PorterDuff$Mode);
    public void setDither(boolean);
    public void setFilterBitmap(boolean);
    public void setHotspot(float, float);
    public void setHotspotBounds(int, int, int, int);
    public boolean setLayoutDirection(int);
    public boolean setLevel(int);
    public boolean setState(int[]);
    public void setTint(int);
    public void setTintList(android.content.res.ColorStateList);
    public void setTintMode(android.graphics.PorterDuff$Mode);
    public boolean setVisible(boolean, boolean);
    public void setXfermode(android.graphics.Xfermode);
    public void unscheduleSelf(java.lang.Runnable);


    protected int mSrcDensityOverride;
}

-keep class android.graphics.drawable.Drawable$Callback {

    public abstract void invalidateDrawable(android.graphics.drawable.Drawable);
    public abstract void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
    public abstract void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);


}

-keep class android.graphics.drawable.Drawable$ConstantState {
    <init>();

    public boolean canApplyTheme();
    public abstract int getChangingConfigurations();
    public abstract android.graphics.drawable.Drawable newDrawable();
    public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources);
    public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources, android.content.res.Resources$Theme);


}

-keep class android.graphics.drawable.DrawableInflater {
    <init>(android.content.res.Resources, java.lang.ClassLoader);

    public android.graphics.drawable.Drawable inflateFromXml(java.lang.String, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
    public static android.graphics.drawable.Drawable loadDrawable(android.content.Context, int);
    public static android.graphics.drawable.Drawable loadDrawable(android.content.res.Resources, android.content.res.Resources$Theme, int);


}

-keep class android.graphics.drawable.Icon {

    public void convertToAshmem();
    public static android.graphics.drawable.Icon createFromStream(java.io.InputStream);
    public static android.graphics.drawable.Icon createWithAdaptiveBitmap(android.graphics.Bitmap);
    public static android.graphics.drawable.Icon createWithBitmap(android.graphics.Bitmap);
    public static android.graphics.drawable.Icon createWithContentUri(java.lang.String);
    public static android.graphics.drawable.Icon createWithContentUri(android.net.Uri);
    public static android.graphics.drawable.Icon createWithData(byte[], int, int);
    public static android.graphics.drawable.Icon createWithFilePath(java.lang.String);
    public static android.graphics.drawable.Icon createWithResource(android.content.Context, int);
    public static android.graphics.drawable.Icon createWithResource(android.content.res.Resources, int);
    public static android.graphics.drawable.Icon createWithResource(java.lang.String, int);
    public int describeContents();
    public android.graphics.Bitmap getBitmap();
    public byte[] getDataBytes();
    public int getDataLength();
    public int getDataOffset();
    public int getResId();
    public java.lang.String getResPackage();
    public android.content.res.Resources getResources();
    public int getType();
    public android.net.Uri getUri();
    public java.lang.String getUriString();
    public boolean hasTint();
    public android.graphics.drawable.Drawable loadDrawable(android.content.Context);
    public android.graphics.drawable.Drawable loadDrawableAsUser(android.content.Context, int);
    public void loadDrawableAsync(android.content.Context, android.os.Message);
    public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon$OnDrawableLoadedListener, android.os.Handler);
    public boolean sameAs(android.graphics.drawable.Icon);
    public static android.graphics.Bitmap scaleDownIfNecessary(android.graphics.Bitmap, int, int);
    public void scaleDownIfNecessary(int, int);
    public android.graphics.drawable.Icon setTint(int);
    public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
    public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff$Mode);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToStream(java.io.OutputStream);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MIN_ASHMEM_ICON_SIZE;
    public static int TYPE_ADAPTIVE_BITMAP;
    public static int TYPE_BITMAP;
    public static int TYPE_DATA;
    public static int TYPE_RESOURCE;
    public static int TYPE_URI;
}

-keep class android.graphics.drawable.Icon$OnDrawableLoadedListener {

    public abstract void onDrawableLoaded(android.graphics.drawable.Drawable);


}

-keep class android.graphics.fonts.FontVariationAxis {
    <init>(java.lang.String, float);

    public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
    public int getOpenTypeTagValue();
    public float getStyleValue();
    public java.lang.String getTag();
    public static int makeTag(java.lang.String);
    public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
    public java.lang.String toString();


}

-keep class android.hardware.display.AmbientBrightnessDayStats {
    <init>(java.time.LocalDate, float[]);
    <init>(java.time.LocalDate, float[], float[]);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public float[] getBucketBoundaries();
    public java.time.LocalDate getLocalDate();
    public float[] getStats();
    public int hashCode();
    public void log(float, float);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.hardware.display.BrightnessChangeEvent {
    <init>(android.hardware.display.BrightnessChangeEvent, boolean);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float batteryLevel;
    public float brightness;
    public int colorTemperature;
    public boolean isDefaultBrightnessConfig;
    public boolean isUserSetBrightness;
    public float lastBrightness;
    public long[] luxTimestamps;
    public float[] luxValues;
    public boolean nightMode;
    public java.lang.String packageName;
    public float powerBrightnessFactor;
    public long timeStamp;
    public int userId;
}

-keep class android.hardware.display.BrightnessConfiguration {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.util.Pair getCurve();
    public java.lang.String getDescription();
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.hardware.display.DisplayManager {
    <init>(android.content.Context);

    public void connectWifiDisplay(java.lang.String);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(android.media.projection.MediaProjection, java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler, java.lang.String);
    public void disconnectWifiDisplay();
    public void forgetWifiDisplay(java.lang.String);
    public java.util.List getAmbientBrightnessStats();
    public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
    public android.hardware.display.BrightnessConfiguration getBrightnessConfigurationForUser(int);
    public java.util.List getBrightnessEvents();
    public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
    public android.view.Display getDisplay(int);
    public android.view.Display[] getDisplays();
    public android.view.Display[] getDisplays(java.lang.String);
    public android.util.Pair getMinimumBrightnessCurve();
    public android.graphics.Point getStableDisplaySize();
    public android.hardware.display.WifiDisplayStatus getWifiDisplayStatus();
    public void pauseWifiDisplay();
    public void registerDisplayListener(android.hardware.display.DisplayManager$DisplayListener, android.os.Handler);
    public void renameWifiDisplay(java.lang.String, java.lang.String);
    public void resumeWifiDisplay();
    public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
    public void setBrightnessConfigurationForUser(android.hardware.display.BrightnessConfiguration, int, java.lang.String);
    public void setSaturationLevel(float);
    public void setTemporaryAutoBrightnessAdjustment(float);
    public void setTemporaryBrightness(int);
    public void startWifiDisplayScan();
    public void stopWifiDisplayScan();
    public void unregisterDisplayListener(android.hardware.display.DisplayManager$DisplayListener);


    public static java.lang.String ACTION_WIFI_DISPLAY_STATUS_CHANGED;
    public static java.lang.String DISPLAY_CATEGORY_PRESENTATION;
    public static java.lang.String EXTRA_WIFI_DISPLAY_STATUS;
    public static int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
    public static int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
    public static int VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
    public static int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
    public static int VIRTUAL_DISPLAY_FLAG_PRESENTATION;
    public static int VIRTUAL_DISPLAY_FLAG_PUBLIC;
    public static int VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT;
    public static int VIRTUAL_DISPLAY_FLAG_SECURE;
    public static int VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH;
}

-keep class android.hardware.display.DisplayManager$DisplayListener {

    public abstract void onDisplayAdded(int);
    public abstract void onDisplayChanged(int);
    public abstract void onDisplayRemoved(int);


}

-keep class android.hardware.display.DisplayManagerGlobal {

    public void connectWifiDisplay(java.lang.String);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(android.content.Context, android.media.projection.MediaProjection, java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler, java.lang.String);
    public void disconnectWifiDisplay();
    public void forgetWifiDisplay(java.lang.String);
    public java.util.List getAmbientBrightnessStats();
    public android.hardware.display.BrightnessConfiguration getBrightnessConfigurationForUser(int);
    public java.util.List getBrightnessEvents(java.lang.String);
    public android.view.Display getCompatibleDisplay(int, android.view.DisplayAdjustments);
    public android.view.Display getCompatibleDisplay(int, android.content.res.Resources);
    public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
    public int[] getDisplayIds();
    public android.view.DisplayInfo getDisplayInfo(int);
    public static android.hardware.display.DisplayManagerGlobal getInstance();
    public android.util.Pair getMinimumBrightnessCurve();
    public android.view.Display getRealDisplay(int);
    public android.graphics.Point getStableDisplaySize();
    public android.hardware.display.WifiDisplayStatus getWifiDisplayStatus();
    public void pauseWifiDisplay();
    public void registerDisplayListener(android.hardware.display.DisplayManager$DisplayListener, android.os.Handler);
    public void releaseVirtualDisplay(android.hardware.display.IVirtualDisplayCallback);
    public void renameWifiDisplay(java.lang.String, java.lang.String);
    public void requestColorMode(int, int);
    public void resizeVirtualDisplay(android.hardware.display.IVirtualDisplayCallback, int, int, int);
    public void resumeWifiDisplay();
    public void setBrightnessConfigurationForUser(android.hardware.display.BrightnessConfiguration, int, java.lang.String);
    public void setSaturationLevel(float);
    public void setTemporaryAutoBrightnessAdjustment(float);
    public void setTemporaryBrightness(int);
    public void setVirtualDisplaySurface(android.hardware.display.IVirtualDisplayCallback, android.view.Surface);
    public void startWifiDisplayScan();
    public void stopWifiDisplayScan();
    public void unregisterDisplayListener(android.hardware.display.DisplayManager$DisplayListener);


    public static int EVENT_DISPLAY_ADDED;
    public static int EVENT_DISPLAY_CHANGED;
    public static int EVENT_DISPLAY_REMOVED;
}

-keep class android.hardware.display.IVirtualDisplayCallback {

    public abstract void onPaused();
    public abstract void onResumed();
    public abstract void onStopped();


}

-keep class android.hardware.display.VirtualDisplay {

    public android.view.Display getDisplay();
    public android.view.Surface getSurface();
    public void release();
    public void resize(int, int, int);
    public void setSurface(android.view.Surface);
    public java.lang.String toString();


}

-keep class android.hardware.display.VirtualDisplay$Callback {
    <init>();

    public void onPaused();
    public void onResumed();
    public void onStopped();


}

-keep class android.hardware.display.WifiDisplay {
    <init>(java.lang.String, java.lang.String, java.lang.String, boolean, boolean, boolean);

    public boolean canConnect();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public boolean equals(android.hardware.display.WifiDisplay);
    public java.lang.String getDeviceAddress();
    public java.lang.String getDeviceAlias();
    public java.lang.String getDeviceName();
    public java.lang.String getFriendlyDisplayName();
    public boolean hasSameAddress(android.hardware.display.WifiDisplay);
    public int hashCode();
    public boolean isAvailable();
    public boolean isRemembered();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.hardware.display.WifiDisplay[] EMPTY_ARRAY;
}

-keep class android.hardware.display.WifiDisplaySessionInfo {
    <init>();
    <init>(boolean, int, java.lang.String, java.lang.String, java.lang.String);

    public int describeContents();
    public java.lang.String getGroupId();
    public java.lang.String getIP();
    public java.lang.String getPassphrase();
    public int getSessionId();
    public boolean isClient();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.hardware.display.WifiDisplayStatus {
    <init>();
    <init>(int, int, int, android.hardware.display.WifiDisplay, android.hardware.display.WifiDisplay[], android.hardware.display.WifiDisplaySessionInfo);

    public int describeContents();
    public android.hardware.display.WifiDisplay getActiveDisplay();
    public int getActiveDisplayState();
    public android.hardware.display.WifiDisplay[] getDisplays();
    public int getFeatureState();
    public int getScanState();
    public android.hardware.display.WifiDisplaySessionInfo getSessionInfo();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int DISPLAY_STATE_CONNECTED;
    public static int DISPLAY_STATE_CONNECTING;
    public static int DISPLAY_STATE_NOT_CONNECTED;
    public static int FEATURE_STATE_DISABLED;
    public static int FEATURE_STATE_OFF;
    public static int FEATURE_STATE_ON;
    public static int FEATURE_STATE_UNAVAILABLE;
    public static int SCAN_STATE_NOT_SCANNING;
    public static int SCAN_STATE_SCANNING;
}

-keep class android.hardware.input.InputDeviceIdentifier {
    <init>(java.lang.String, int, int);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getDescriptor();
    public int getProductId();
    public int getVendorId();
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.media.AudioAttributes {

    public java.lang.String contentTypeToString();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getAllFlags();
    public android.os.Bundle getBundle();
    public int getCapturePreset();
    public int getContentType();
    public int getFlags();
    public java.util.Set getTags();
    public int getUsage();
    public int getVolumeControlStream();
    public int hashCode();
    public static int toLegacyStreamType(android.media.AudioAttributes);
    public java.lang.String toString();
    public java.lang.String usageToString();
    public static java.lang.String usageToString(int);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int CONTENT_TYPE_MOVIE;
    public static int CONTENT_TYPE_MUSIC;
    public static int CONTENT_TYPE_SONIFICATION;
    public static int CONTENT_TYPE_SPEECH;
    public static int CONTENT_TYPE_UNKNOWN;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_AUDIBILITY_ENFORCED;
    public static int FLAG_BEACON;
    public static int FLAG_BYPASS_INTERRUPTION_POLICY;
    public static int FLAG_BYPASS_MUTE;
    public static int FLAG_DEEP_BUFFER;
    public static int FLAG_HW_AV_SYNC;
    public static int FLAG_HW_HOTWORD;
    public static int FLAG_LOW_LATENCY;
    public static int FLAG_SCO;
    public static int FLAG_SECURE;
    public static int FLATTEN_TAGS;
    public static int[] SDK_USAGES;
    public static int SUPPRESSIBLE_ALARM;
    public static int SUPPRESSIBLE_CALL;
    public static int SUPPRESSIBLE_MEDIA;
    public static int SUPPRESSIBLE_NEVER;
    public static int SUPPRESSIBLE_NOTIFICATION;
    public static int SUPPRESSIBLE_SYSTEM;
    public static android.util.SparseIntArray SUPPRESSIBLE_USAGES;
    public static int USAGE_ALARM;
    public static int USAGE_ASSISTANCE_ACCESSIBILITY;
    public static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
    public static int USAGE_ASSISTANCE_SONIFICATION;
    public static int USAGE_ASSISTANT;
    public static int USAGE_GAME;
    public static int USAGE_MEDIA;
    public static int USAGE_NOTIFICATION;
    public static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
    public static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
    public static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
    public static int USAGE_NOTIFICATION_EVENT;
    public static int USAGE_NOTIFICATION_RINGTONE;
    public static int USAGE_UNKNOWN;
    public static int USAGE_VIRTUAL_SOURCE;
    public static int USAGE_VOICE_COMMUNICATION;
    public static int USAGE_VOICE_COMMUNICATION_SIGNALLING;
}

-keep class android.media.AudioDeviceInfo {

    public static int convertDeviceTypeToInternalDevice(int);
    public static int convertInternalDeviceToDeviceType(int);
    public boolean equals(java.lang.Object);
    public java.lang.String getAddress();
    public int[] getChannelCounts();
    public int[] getChannelIndexMasks();
    public int[] getChannelMasks();
    public int[] getEncodings();
    public int getId();
    public android.media.AudioDevicePort getPort();
    public java.lang.CharSequence getProductName();
    public int[] getSampleRates();
    public int getType();
    public int hashCode();
    public boolean isSink();
    public boolean isSource();


    public static int TYPE_AUX_LINE;
    public static int TYPE_BLUETOOTH_A2DP;
    public static int TYPE_BLUETOOTH_SCO;
    public static int TYPE_BUILTIN_EARPIECE;
    public static int TYPE_BUILTIN_MIC;
    public static int TYPE_BUILTIN_SPEAKER;
    public static int TYPE_BUS;
    public static int TYPE_DOCK;
    public static int TYPE_FM;
    public static int TYPE_FM_TUNER;
    public static int TYPE_HDMI;
    public static int TYPE_HDMI_ARC;
    public static int TYPE_HEARING_AID;
    public static int TYPE_IP;
    public static int TYPE_LINE_ANALOG;
    public static int TYPE_LINE_DIGITAL;
    public static int TYPE_TELEPHONY;
    public static int TYPE_TV_TUNER;
    public static int TYPE_UNKNOWN;
    public static int TYPE_USB_ACCESSORY;
    public static int TYPE_USB_DEVICE;
    public static int TYPE_USB_HEADSET;
    public static int TYPE_WIRED_HEADPHONES;
    public static int TYPE_WIRED_HEADSET;
}

-keep class android.media.AudioDevicePort {

    public java.lang.String address();
    public android.media.AudioDevicePortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
    public android.media.AudioPortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
    public boolean equals(java.lang.Object);
    public java.lang.String toString();
    public int type();


}

-keep class android.media.AudioDevicePortConfig {

    public android.media.AudioDevicePort port();
    public android.media.AudioPort port();


}

-keep class android.media.AudioFormat {
    <init>();

    public static int channelCountFromInChannelMask(int);
    public static int channelCountFromOutChannelMask(int);
    public static int convertChannelOutMaskToNativeMask(int);
    public static int convertNativeChannelMaskToOutMask(int);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static int[] filterPublicFormats(int[]);
    public static int getBytesPerSample(int);
    public int getChannelCount();
    public int getChannelIndexMask();
    public int getChannelMask();
    public int getEncoding();
    public int getPropertySetMask();
    public int getSampleRate();
    public int hashCode();
    public static int inChannelMaskFromOutChannelMask(int);
    public static boolean isEncodingLinearFrames(int);
    public static boolean isEncodingLinearPcm(int);
    public static boolean isPublicEncoding(int);
    public static boolean isValidEncoding(int);
    public static java.lang.String toDisplayName(int);
    public static java.lang.String toLogFriendlyEncoding(int);
    public java.lang.String toLogFriendlyString();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK;
    public static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK;
    public static int AUDIO_FORMAT_HAS_PROPERTY_ENCODING;
    public static int AUDIO_FORMAT_HAS_PROPERTY_NONE;
    public static int AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE;
    public static int CHANNEL_CONFIGURATION_DEFAULT;
    public static int CHANNEL_CONFIGURATION_INVALID;
    public static int CHANNEL_CONFIGURATION_MONO;
    public static int CHANNEL_CONFIGURATION_STEREO;
    public static int CHANNEL_INVALID;
    public static int CHANNEL_IN_BACK;
    public static int CHANNEL_IN_BACK_PROCESSED;
    public static int CHANNEL_IN_DEFAULT;
    public static int CHANNEL_IN_FRONT;
    public static int CHANNEL_IN_FRONT_BACK;
    public static int CHANNEL_IN_FRONT_PROCESSED;
    public static int CHANNEL_IN_LEFT;
    public static int CHANNEL_IN_LEFT_PROCESSED;
    public static int CHANNEL_IN_MONO;
    public static int CHANNEL_IN_PRESSURE;
    public static int CHANNEL_IN_RIGHT;
    public static int CHANNEL_IN_RIGHT_PROCESSED;
    public static int CHANNEL_IN_STEREO;
    public static int CHANNEL_IN_VOICE_DNLINK;
    public static int CHANNEL_IN_VOICE_UPLINK;
    public static int CHANNEL_IN_X_AXIS;
    public static int CHANNEL_IN_Y_AXIS;
    public static int CHANNEL_IN_Z_AXIS;
    public static int CHANNEL_OUT_5POINT1;
    public static int CHANNEL_OUT_5POINT1_SIDE;
    public static int CHANNEL_OUT_7POINT1;
    public static int CHANNEL_OUT_7POINT1_SURROUND;
    public static int CHANNEL_OUT_BACK_CENTER;
    public static int CHANNEL_OUT_BACK_LEFT;
    public static int CHANNEL_OUT_BACK_RIGHT;
    public static int CHANNEL_OUT_DEFAULT;
    public static int CHANNEL_OUT_FRONT_CENTER;
    public static int CHANNEL_OUT_FRONT_LEFT;
    public static int CHANNEL_OUT_FRONT_LEFT_OF_CENTER;
    public static int CHANNEL_OUT_FRONT_RIGHT;
    public static int CHANNEL_OUT_FRONT_RIGHT_OF_CENTER;
    public static int CHANNEL_OUT_LOW_FREQUENCY;
    public static int CHANNEL_OUT_MONO;
    public static int CHANNEL_OUT_QUAD;
    public static int CHANNEL_OUT_QUAD_SIDE;
    public static int CHANNEL_OUT_SIDE_LEFT;
    public static int CHANNEL_OUT_SIDE_RIGHT;
    public static int CHANNEL_OUT_STEREO;
    public static int CHANNEL_OUT_SURROUND;
    public static int CHANNEL_OUT_TOP_BACK_CENTER;
    public static int CHANNEL_OUT_TOP_BACK_LEFT;
    public static int CHANNEL_OUT_TOP_BACK_RIGHT;
    public static int CHANNEL_OUT_TOP_CENTER;
    public static int CHANNEL_OUT_TOP_FRONT_CENTER;
    public static int CHANNEL_OUT_TOP_FRONT_LEFT;
    public static int CHANNEL_OUT_TOP_FRONT_RIGHT;
    public static android.os.Parcelable$Creator CREATOR;
    public static int ENCODING_AAC_ELD;
    public static int ENCODING_AAC_HE_V1;
    public static int ENCODING_AAC_HE_V2;
    public static int ENCODING_AAC_LC;
    public static int ENCODING_AAC_XHE;
    public static int ENCODING_AC3;
    public static int ENCODING_AC4;
    public static int ENCODING_DEFAULT;
    public static int ENCODING_DOLBY_TRUEHD;
    public static int ENCODING_DTS;
    public static int ENCODING_DTS_HD;
    public static int ENCODING_E_AC3;
    public static int ENCODING_E_AC3_JOC;
    public static int ENCODING_IEC61937;
    public static int ENCODING_INVALID;
    public static int ENCODING_MP3;
    public static int ENCODING_PCM_16BIT;
    public static int ENCODING_PCM_8BIT;
    public static int ENCODING_PCM_FLOAT;
    public static int SAMPLE_RATE_HZ_MAX;
    public static int SAMPLE_RATE_HZ_MIN;
    public static int SAMPLE_RATE_UNSPECIFIED;
    public static int[] SURROUND_SOUND_ENCODING;
}

-keep class android.media.AudioGain {

    public android.media.AudioGainConfig buildConfig(int, int, int[], int);
    public int channelMask();
    public int defaultValue();
    public int maxValue();
    public int minValue();
    public int mode();
    public int rampDurationMaxMs();
    public int rampDurationMinMs();
    public int stepValue();


    public static int MODE_CHANNELS;
    public static int MODE_JOINT;
    public static int MODE_RAMP;
}

-keep class android.media.AudioGainConfig {

    public int channelMask();
    public int mode();
    public int rampDurationMs();
    public int[] values();


}

-keep class android.media.AudioPort {

    public android.media.AudioPortConfig activeConfig();
    public android.media.AudioPortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
    public int[] channelIndexMasks();
    public int[] channelMasks();
    public boolean equals(java.lang.Object);
    public int[] formats();
    public android.media.AudioGain[] gains();
    public int hashCode();
    public int id();
    public java.lang.String name();
    public int role();
    public int[] samplingRates();
    public java.lang.String toString();


    public static int ROLE_NONE;
    public static int ROLE_SINK;
    public static int ROLE_SOURCE;
    public static int TYPE_DEVICE;
    public static int TYPE_NONE;
    public static int TYPE_SESSION;
    public static int TYPE_SUBMIX;
    protected int mRole;
}

-keep class android.media.AudioPortConfig {

    public int channelMask();
    public int format();
    public android.media.AudioGainConfig gain();
    public android.media.AudioPort port();
    public int samplingRate();
    public java.lang.String toString();


}

-keep class android.media.AudioRecord {
    <init>(int, int, int, int, int);
    <init>(android.media.AudioAttributes, android.media.AudioFormat, int, int);

    public void addOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener, android.os.Handler);
    public void addOnRoutingChangedListener(android.media.AudioRecord$OnRoutingChangedListener, android.os.Handler);
    protected void finalize();
    public java.util.List getActiveMicrophones();
    public int getAudioFormat();
    public int getAudioSessionId();
    public int getAudioSource();
    public int getBufferSizeInFrames();
    public int getChannelConfiguration();
    public int getChannelCount();
    public android.media.AudioFormat getFormat();
    public android.os.PersistableBundle getMetrics();
    public static int getMinBufferSize(int, int, int);
    public int getNotificationMarkerPosition();
    public int getPositionNotificationPeriod();
    public android.media.AudioDeviceInfo getPreferredDevice();
    public int getRecordingState();
    public android.media.AudioDeviceInfo getRoutedDevice();
    public int getSampleRate();
    public int getState();
    public int getTimestamp(android.media.AudioTimestamp, int);
    public void native_release();
    public int read(byte[], int, int);
    public int read(byte[], int, int, int);
    public int read(short[], int, int);
    public int read(short[], int, int, int);
    public int read(float[], int, int, int);
    public int read(java.nio.ByteBuffer, int);
    public int read(java.nio.ByteBuffer, int, int);
    public void release();
    public void removeOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener);
    public void removeOnRoutingChangedListener(android.media.AudioRecord$OnRoutingChangedListener);
    public int setNotificationMarkerPosition(int);
    public int setPositionNotificationPeriod(int);
    public boolean setPreferredDevice(android.media.AudioDeviceInfo);
    public void setRecordPositionUpdateListener(android.media.AudioRecord$OnRecordPositionUpdateListener);
    public void setRecordPositionUpdateListener(android.media.AudioRecord$OnRecordPositionUpdateListener, android.os.Handler);
    public void startRecording();
    public void startRecording(android.media.MediaSyncEvent);
    public void stop();


    public static int ERROR;
    public static int ERROR_BAD_VALUE;
    public static int ERROR_DEAD_OBJECT;
    public static int ERROR_INVALID_OPERATION;
    public static int READ_BLOCKING;
    public static int READ_NON_BLOCKING;
    public static int RECORDSTATE_RECORDING;
    public static int RECORDSTATE_STOPPED;
    public static int STATE_INITIALIZED;
    public static int STATE_UNINITIALIZED;
    public static java.lang.String SUBMIX_FIXED_VOLUME;
    public static int SUCCESS;
}

-keep class android.media.AudioRecord$OnRecordPositionUpdateListener {

    public abstract void onMarkerReached(android.media.AudioRecord);
    public abstract void onPeriodicNotification(android.media.AudioRecord);


}

-keep class android.media.AudioRecord$OnRoutingChangedListener {

    public abstract void onRoutingChanged(android.media.AudioRecord);
    public void onRoutingChanged(android.media.AudioRouting);


}

-keep class android.media.AudioRouting {

    public abstract void addOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener, android.os.Handler);
    public abstract android.media.AudioDeviceInfo getPreferredDevice();
    public abstract android.media.AudioDeviceInfo getRoutedDevice();
    public abstract void removeOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener);
    public abstract boolean setPreferredDevice(android.media.AudioDeviceInfo);


}

-keep class android.media.AudioRouting$OnRoutingChangedListener {

    public abstract void onRoutingChanged(android.media.AudioRouting);


}

-keep class android.media.AudioTimestamp {
    <init>();



    public static int TIMEBASE_BOOTTIME;
    public static int TIMEBASE_MONOTONIC;
    public long framePosition;
    public long nanoTime;
}

-keep class android.media.IRemoteVolumeController {

    public abstract void remoteVolumeChanged(android.media.session.ISessionController, int);
    public abstract void updateRemoteController(android.media.session.ISessionController);


}

-keep class android.media.MediaDescription {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.CharSequence getDescription();
    public android.os.Bundle getExtras();
    public android.graphics.Bitmap getIconBitmap();
    public android.net.Uri getIconUri();
    public java.lang.String getMediaId();
    public android.net.Uri getMediaUri();
    public java.lang.CharSequence getSubtitle();
    public java.lang.CharSequence getTitle();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static long BT_FOLDER_TYPE_ALBUMS;
    public static long BT_FOLDER_TYPE_ARTISTS;
    public static long BT_FOLDER_TYPE_GENRES;
    public static long BT_FOLDER_TYPE_MIXED;
    public static long BT_FOLDER_TYPE_PLAYLISTS;
    public static long BT_FOLDER_TYPE_TITLES;
    public static long BT_FOLDER_TYPE_YEARS;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_BT_FOLDER_TYPE;
}

-keep class android.media.MediaMetadata {

    public boolean containsKey(java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.graphics.Bitmap getBitmap(java.lang.String);
    public android.media.MediaDescription getDescription();
    public static java.lang.String getKeyFromMetadataEditorKey(int);
    public long getLong(java.lang.String);
    public android.media.Rating getRating(java.lang.String);
    public java.lang.String getString(java.lang.String);
    public java.lang.CharSequence getText(java.lang.String);
    public int hashCode();
    public java.util.Set keySet();
    public int size();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String METADATA_KEY_ALBUM;
    public static java.lang.String METADATA_KEY_ALBUM_ART;
    public static java.lang.String METADATA_KEY_ALBUM_ARTIST;
    public static java.lang.String METADATA_KEY_ALBUM_ART_URI;
    public static java.lang.String METADATA_KEY_ART;
    public static java.lang.String METADATA_KEY_ARTIST;
    public static java.lang.String METADATA_KEY_ART_URI;
    public static java.lang.String METADATA_KEY_AUTHOR;
    public static java.lang.String METADATA_KEY_BT_FOLDER_TYPE;
    public static java.lang.String METADATA_KEY_COMPILATION;
    public static java.lang.String METADATA_KEY_COMPOSER;
    public static java.lang.String METADATA_KEY_DATE;
    public static java.lang.String METADATA_KEY_DISC_NUMBER;
    public static java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION;
    public static java.lang.String METADATA_KEY_DISPLAY_ICON;
    public static java.lang.String METADATA_KEY_DISPLAY_ICON_URI;
    public static java.lang.String METADATA_KEY_DISPLAY_SUBTITLE;
    public static java.lang.String METADATA_KEY_DISPLAY_TITLE;
    public static java.lang.String METADATA_KEY_DURATION;
    public static java.lang.String METADATA_KEY_GENRE;
    public static java.lang.String METADATA_KEY_MEDIA_ID;
    public static java.lang.String METADATA_KEY_MEDIA_URI;
    public static java.lang.String METADATA_KEY_NUM_TRACKS;
    public static java.lang.String METADATA_KEY_RATING;
    public static java.lang.String METADATA_KEY_TITLE;
    public static java.lang.String METADATA_KEY_TRACK_NUMBER;
    public static java.lang.String METADATA_KEY_USER_RATING;
    public static java.lang.String METADATA_KEY_WRITER;
    public static java.lang.String METADATA_KEY_YEAR;
}

-keep class android.media.MediaSyncEvent {

    public static android.media.MediaSyncEvent createEvent(int);
    public int getAudioSessionId();
    public int getType();
    public android.media.MediaSyncEvent setAudioSessionId(int);


    public static int SYNC_EVENT_NONE;
    public static int SYNC_EVENT_PRESENTATION_COMPLETE;
}

-keep class android.media.MicrophoneInfo {

    public java.lang.String getAddress();
    public java.util.List getChannelMapping();
    public java.lang.String getDescription();
    public int getDirectionality();
    public java.util.List getFrequencyResponse();
    public int getGroup();
    public int getId();
    public int getIndexInTheGroup();
    public int getInternalDeviceType();
    public int getLocation();
    public float getMaxSpl();
    public float getMinSpl();
    public android.media.MicrophoneInfo$Coordinate3F getOrientation();
    public android.media.MicrophoneInfo$Coordinate3F getPosition();
    public float getSensitivity();
    public int getType();
    public void setChannelMapping(java.util.List);
    public void setId(int);


    public static int CHANNEL_MAPPING_DIRECT;
    public static int CHANNEL_MAPPING_PROCESSED;
    public static int DIRECTIONALITY_BI_DIRECTIONAL;
    public static int DIRECTIONALITY_CARDIOID;
    public static int DIRECTIONALITY_HYPER_CARDIOID;
    public static int DIRECTIONALITY_OMNI;
    public static int DIRECTIONALITY_SUPER_CARDIOID;
    public static int DIRECTIONALITY_UNKNOWN;
    public static int GROUP_UNKNOWN;
    public static int INDEX_IN_THE_GROUP_UNKNOWN;
    public static int LOCATION_MAINBODY;
    public static int LOCATION_MAINBODY_MOVABLE;
    public static int LOCATION_PERIPHERAL;
    public static int LOCATION_UNKNOWN;
    public static android.media.MicrophoneInfo$Coordinate3F ORIENTATION_UNKNOWN;
    public static android.media.MicrophoneInfo$Coordinate3F POSITION_UNKNOWN;
    public static float SENSITIVITY_UNKNOWN;
    public static float SPL_UNKNOWN;
}

-keep class android.media.MicrophoneInfo$Coordinate3F {

    public boolean equals(java.lang.Object);


    public float x;
    public float y;
    public float z;
}

-keep class android.media.Rating {

    public int describeContents();
    public float getPercentRating();
    public int getRatingStyle();
    public float getStarRating();
    public boolean hasHeart();
    public boolean isRated();
    public boolean isThumbUp();
    public static android.media.Rating newHeartRating(boolean);
    public static android.media.Rating newPercentageRating(float);
    public static android.media.Rating newStarRating(int, float);
    public static android.media.Rating newThumbRating(boolean);
    public static android.media.Rating newUnratedRating(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int RATING_3_STARS;
    public static int RATING_4_STARS;
    public static int RATING_5_STARS;
    public static int RATING_HEART;
    public static int RATING_NONE;
    public static int RATING_PERCENTAGE;
    public static int RATING_THUMB_UP_DOWN;
}

-keep class android.media.SessionToken2 {
    <init>(android.content.Context, java.lang.String, java.lang.String);
    <init>(android.content.Context, java.lang.String, java.lang.String, int);
    <init>(android.media.update.SessionToken2Provider);

    public boolean equals(java.lang.Object);
    public static android.media.SessionToken2 fromBundle(android.os.Bundle);
    public java.lang.String getId();
    public java.lang.String getPackageName();
    public android.media.update.SessionToken2Provider getProvider();
    public int getType();
    public int getUid();
    public int hashCode();
    public android.os.Bundle toBundle();
    public java.lang.String toString();


    public static int TYPE_LIBRARY_SERVICE;
    public static int TYPE_SESSION;
    public static int TYPE_SESSION_SERVICE;
}

-keep class android.media.VolumeProvider {
    <init>(int, int, int);

    public int getCurrentVolume();
    public int getMaxVolume();
    public int getVolumeControl();
    public void onAdjustVolume(int);
    public void onSetVolumeTo(int);
    public void setCallback(android.media.VolumeProvider$Callback);
    public void setCurrentVolume(int);


    public static int VOLUME_CONTROL_ABSOLUTE;
    public static int VOLUME_CONTROL_FIXED;
    public static int VOLUME_CONTROL_RELATIVE;
}

-keep class android.media.VolumeProvider$Callback {
    <init>();

    public abstract void onVolumeChanged(android.media.VolumeProvider);


}

-keep class android.media.projection.IMediaProjection {

    public abstract int applyVirtualDisplayFlags(int);
    public abstract boolean canProjectAudio();
    public abstract boolean canProjectSecureVideo();
    public abstract boolean canProjectVideo();
    public abstract void registerCallback(android.media.projection.IMediaProjectionCallback);
    public abstract void start(android.media.projection.IMediaProjectionCallback);
    public abstract void stop();
    public abstract void unregisterCallback(android.media.projection.IMediaProjectionCallback);


}

-keep class android.media.projection.IMediaProjectionCallback {

    public abstract void onStop();


}

-keep class android.media.projection.MediaProjection {
    <init>(android.content.Context, android.media.projection.IMediaProjection);

    public android.media.AudioRecord createAudioRecord(int, int, int, int);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, boolean, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
    public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
    public android.media.projection.IMediaProjection getProjection();
    public void registerCallback(android.media.projection.MediaProjection$Callback, android.os.Handler);
    public void stop();
    public void unregisterCallback(android.media.projection.MediaProjection$Callback);


}

-keep class android.media.projection.MediaProjection$Callback {
    <init>();

    public void onStop();


}

-keep class android.media.session.ISession {

    public abstract void destroy();
    public abstract android.media.session.ISessionController getController();
    public abstract void sendEvent(java.lang.String, android.os.Bundle);
    public abstract void setActive(boolean);
    public abstract void setCurrentVolume(int);
    public abstract void setExtras(android.os.Bundle);
    public abstract void setFlags(int);
    public abstract void setLaunchPendingIntent(android.app.PendingIntent);
    public abstract void setMediaButtonReceiver(android.app.PendingIntent);
    public abstract void setMetadata(android.media.MediaMetadata);
    public abstract void setPlaybackState(android.media.session.PlaybackState);
    public abstract void setPlaybackToLocal(android.media.AudioAttributes);
    public abstract void setPlaybackToRemote(int, int);
    public abstract void setQueue(android.content.pm.ParceledListSlice);
    public abstract void setQueueTitle(java.lang.CharSequence);
    public abstract void setRatingType(int);


}

-keep class android.media.session.ISessionCallback {

    public abstract void onAdjustVolume(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public abstract void onCommand(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public abstract void onCustomAction(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onFastForward(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onMediaButton(java.lang.String, int, int, android.content.Intent, int, android.os.ResultReceiver);
    public abstract void onMediaButtonFromController(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.content.Intent);
    public abstract void onNext(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPause(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPlay(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPlayFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPlayFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPlayFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void onPrepare(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onPrepareFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPrepareFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void onPrepareFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void onPrevious(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onRate(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.media.Rating);
    public abstract void onRewind(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public abstract void onSeekTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public abstract void onSetVolumeTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public abstract void onSkipToTrack(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public abstract void onStop(java.lang.String, int, int, android.media.session.ISessionControllerCallback);


}

-keep class android.media.session.ISessionCallback$Stub {
    <init>();

    public android.os.IBinder asBinder();
    public static android.media.session.ISessionCallback asInterface(android.os.IBinder);
    public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);


}

-keep class android.media.session.ISessionController {

    public abstract void adjustVolume(java.lang.String, android.media.session.ISessionControllerCallback, boolean, int, int);
    public abstract void fastForward(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract android.os.Bundle getExtras();
    public abstract long getFlags();
    public abstract android.app.PendingIntent getLaunchPendingIntent();
    public abstract android.media.MediaMetadata getMetadata();
    public abstract java.lang.String getPackageName();
    public abstract android.media.session.PlaybackState getPlaybackState();
    public abstract android.content.pm.ParceledListSlice getQueue();
    public abstract java.lang.CharSequence getQueueTitle();
    public abstract int getRatingType();
    public abstract java.lang.String getTag();
    public abstract android.media.session.ParcelableVolumeInfo getVolumeAttributes();
    public abstract boolean isTransportControlEnabled();
    public abstract void next(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void pause(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void play(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void playFromMediaId(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void playFromSearch(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void playFromUri(java.lang.String, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void prepare(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void prepareFromMediaId(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void prepareFromSearch(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract void prepareFromUri(java.lang.String, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public abstract void previous(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void rate(java.lang.String, android.media.session.ISessionControllerCallback, android.media.Rating);
    public abstract void registerCallbackListener(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void rewind(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void seekTo(java.lang.String, android.media.session.ISessionControllerCallback, long);
    public abstract void sendCommand(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public abstract void sendCustomAction(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public abstract boolean sendMediaButton(java.lang.String, android.media.session.ISessionControllerCallback, boolean, android.view.KeyEvent);
    public abstract void setVolumeTo(java.lang.String, android.media.session.ISessionControllerCallback, int, int);
    public abstract void skipToQueueItem(java.lang.String, android.media.session.ISessionControllerCallback, long);
    public abstract void stop(java.lang.String, android.media.session.ISessionControllerCallback);
    public abstract void unregisterCallbackListener(android.media.session.ISessionControllerCallback);


}

-keep class android.media.session.ISessionControllerCallback {

    public abstract void onEvent(java.lang.String, android.os.Bundle);
    public abstract void onExtrasChanged(android.os.Bundle);
    public abstract void onMetadataChanged(android.media.MediaMetadata);
    public abstract void onPlaybackStateChanged(android.media.session.PlaybackState);
    public abstract void onQueueChanged(android.content.pm.ParceledListSlice);
    public abstract void onQueueTitleChanged(java.lang.CharSequence);
    public abstract void onSessionDestroyed();
    public abstract void onVolumeInfoChanged(android.media.session.ParcelableVolumeInfo);


}

-keep class android.media.session.MediaController {
    <init>(android.content.Context, android.media.session.ISessionController);
    <init>(android.content.Context, android.media.session.MediaSession$Token);

    public void adjustVolume(int, int);
    public boolean controlsSameSession(android.media.session.MediaController);
    public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
    public boolean dispatchMediaButtonEventAsSystemService(android.view.KeyEvent);
    public void dispatchVolumeButtonEventAsSystemService(android.view.KeyEvent);
    public android.os.Bundle getExtras();
    public long getFlags();
    public android.media.MediaMetadata getMetadata();
    public java.lang.String getPackageName();
    public android.media.session.MediaController$PlaybackInfo getPlaybackInfo();
    public android.media.session.PlaybackState getPlaybackState();
    public java.util.List getQueue();
    public java.lang.CharSequence getQueueTitle();
    public int getRatingType();
    public android.app.PendingIntent getSessionActivity();
    public android.media.session.MediaSession$Token getSessionToken();
    public java.lang.String getTag();
    public android.media.session.MediaController$TransportControls getTransportControls();
    public void registerCallback(android.media.session.MediaController$Callback);
    public void registerCallback(android.media.session.MediaController$Callback, android.os.Handler);
    public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public void setVolumeTo(int, int);
    public void unregisterCallback(android.media.session.MediaController$Callback);


}

-keep class android.media.session.MediaController$Callback {
    <init>();

    public void onAudioInfoChanged(android.media.session.MediaController$PlaybackInfo);
    public void onExtrasChanged(android.os.Bundle);
    public void onMetadataChanged(android.media.MediaMetadata);
    public void onPlaybackStateChanged(android.media.session.PlaybackState);
    public void onQueueChanged(java.util.List);
    public void onQueueTitleChanged(java.lang.CharSequence);
    public void onSessionDestroyed();
    public void onSessionEvent(java.lang.String, android.os.Bundle);


}

-keep class android.media.session.MediaController$PlaybackInfo {
    <init>(int, android.media.AudioAttributes, int, int, int);

    public android.media.AudioAttributes getAudioAttributes();
    public int getCurrentVolume();
    public int getMaxVolume();
    public int getPlaybackType();
    public int getVolumeControl();


    public static int PLAYBACK_TYPE_LOCAL;
    public static int PLAYBACK_TYPE_REMOTE;
}

-keep class android.media.session.MediaController$TransportControls {

    public void fastForward();
    public void pause();
    public void play();
    public void playFromMediaId(java.lang.String, android.os.Bundle);
    public void playFromSearch(java.lang.String, android.os.Bundle);
    public void playFromUri(android.net.Uri, android.os.Bundle);
    public void prepare();
    public void prepareFromMediaId(java.lang.String, android.os.Bundle);
    public void prepareFromSearch(java.lang.String, android.os.Bundle);
    public void prepareFromUri(android.net.Uri, android.os.Bundle);
    public void rewind();
    public void seekTo(long);
    public void sendCustomAction(android.media.session.PlaybackState$CustomAction, android.os.Bundle);
    public void sendCustomAction(java.lang.String, android.os.Bundle);
    public void setRating(android.media.Rating);
    public void skipToNext();
    public void skipToPrevious();
    public void skipToQueueItem(long);
    public void stop();


}

-keep class android.media.session.MediaSession {
    <init>(android.content.Context, java.lang.String);
    <init>(android.content.Context, java.lang.String, int);

    public java.lang.String getCallingPackage();
    public android.media.session.MediaController getController();
    public android.media.session.MediaSessionManager$RemoteUserInfo getCurrentControllerInfo();
    public android.media.session.MediaSession$Token getSessionToken();
    public boolean isActive();
    public static boolean isActiveState(int);
    public void notifyRemoteVolumeChanged(android.media.VolumeProvider);
    public void release();
    public void sendSessionEvent(java.lang.String, android.os.Bundle);
    public void setActive(boolean);
    public void setCallback(android.media.session.MediaSession$Callback);
    public void setCallback(android.media.session.MediaSession$Callback, android.os.Handler);
    public void setExtras(android.os.Bundle);
    public void setFlags(int);
    public void setMediaButtonReceiver(android.app.PendingIntent);
    public void setMetadata(android.media.MediaMetadata);
    public void setPlaybackState(android.media.session.PlaybackState);
    public void setPlaybackToLocal(android.media.AudioAttributes);
    public void setPlaybackToRemote(android.media.VolumeProvider);
    public void setQueue(java.util.List);
    public void setQueueTitle(java.lang.CharSequence);
    public void setRatingType(int);
    public void setSessionActivity(android.app.PendingIntent);


    public static int FLAG_EXCLUSIVE_GLOBAL_PRIORITY;
    public static int FLAG_HANDLES_MEDIA_BUTTONS;
    public static int FLAG_HANDLES_TRANSPORT_CONTROLS;
    public static int INVALID_PID;
    public static int INVALID_UID;
}

-keep class android.media.session.MediaSession$Callback {
    <init>();

    public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public void onCustomAction(java.lang.String, android.os.Bundle);
    public void onFastForward();
    public boolean onMediaButtonEvent(android.content.Intent);
    public void onPause();
    public void onPlay();
    public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
    public void onPlayFromSearch(java.lang.String, android.os.Bundle);
    public void onPlayFromUri(android.net.Uri, android.os.Bundle);
    public void onPrepare();
    public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
    public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
    public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
    public void onRewind();
    public void onSeekTo(long);
    public void onSetRating(android.media.Rating);
    public void onSkipToNext();
    public void onSkipToPrevious();
    public void onSkipToQueueItem(long);
    public void onStop();


}

-keep class android.media.session.MediaSession$CallbackStub {
    <init>(android.media.session.MediaSession);

    public void onAdjustVolume(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public void onCommand(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
    public void onCustomAction(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onFastForward(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onMediaButton(java.lang.String, int, int, android.content.Intent, int, android.os.ResultReceiver);
    public void onMediaButtonFromController(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.content.Intent);
    public void onNext(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPause(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPlay(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPlayFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPlayFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPlayFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public void onPrepare(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onPrepareFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPrepareFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
    public void onPrepareFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
    public void onPrevious(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onRate(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.media.Rating);
    public void onRewind(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
    public void onSeekTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public void onSetVolumeTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
    public void onSkipToTrack(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
    public void onStop(java.lang.String, int, int, android.media.session.ISessionControllerCallback);


}

-keep class android.media.session.MediaSession$QueueItem {
    <init>(android.media.MediaDescription, long);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.media.MediaDescription getDescription();
    public long getQueueId();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int UNKNOWN_ID;
}

-keep class android.media.session.MediaSession$Token {
    <init>(android.media.session.ISessionController);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.media.session.MediaSessionManager {
    <init>(android.content.Context);

    public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName);
    public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler);
    public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName, int, android.os.Handler);
    public void addOnSessionTokensChangedListener(java.util.concurrent.Executor, android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
    public void addOnSessionTokensChangedListener(int, java.util.concurrent.Executor, android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
    public android.media.session.ISession createSession(android.media.session.MediaSession$CallbackStub, java.lang.String, int);
    public boolean createSession2(android.media.SessionToken2);
    public void destroySession2(android.media.SessionToken2);
    public void dispatchAdjustVolume(int, int, int);
    public void dispatchMediaKeyEvent(android.view.KeyEvent);
    public void dispatchMediaKeyEvent(android.view.KeyEvent, boolean);
    public void dispatchMediaKeyEventAsSystemService(android.view.KeyEvent);
    public void dispatchVolumeKeyEvent(android.view.KeyEvent, int, boolean);
    public void dispatchVolumeKeyEventAsSystemService(android.view.KeyEvent, int);
    public java.util.List getActiveSessionTokens();
    public java.util.List getActiveSessions(android.content.ComponentName);
    public java.util.List getActiveSessionsForUser(android.content.ComponentName, int);
    public java.util.List getAllSessionTokens();
    public java.util.List getSessionServiceTokens();
    public boolean isGlobalPriorityActive();
    public boolean isTrustedForMediaControl(android.media.session.MediaSessionManager$RemoteUserInfo);
    public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener);
    public void removeOnSessionTokensChangedListener(android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
    public void setCallback(android.media.session.MediaSessionManager$Callback, android.os.Handler);
    public void setOnMediaKeyListener(android.media.session.MediaSessionManager$OnMediaKeyListener, android.os.Handler);
    public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener, android.os.Handler);
    public void setRemoteVolumeController(android.media.IRemoteVolumeController);


    public static int RESULT_MEDIA_KEY_HANDLED;
    public static int RESULT_MEDIA_KEY_NOT_HANDLED;
}

-keep class android.media.session.MediaSessionManager$Callback {
    <init>();

    public abstract void onAddressedPlayerChanged(android.media.session.MediaSession$Token);
    public abstract void onAddressedPlayerChanged(android.content.ComponentName);
    public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.media.session.MediaSession$Token);
    public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.content.ComponentName);


}

-keep class android.media.session.MediaSessionManager$OnActiveSessionsChangedListener {

    public abstract void onActiveSessionsChanged(java.util.List);


}

-keep class android.media.session.MediaSessionManager$OnMediaKeyListener {

    public abstract boolean onMediaKey(android.view.KeyEvent);


}

-keep class android.media.session.MediaSessionManager$OnSessionTokensChangedListener {

    public abstract void onSessionTokensChanged(java.util.List);


}

-keep class android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener {

    public abstract void onVolumeKeyLongPress(android.view.KeyEvent);


}

-keep class android.media.session.MediaSessionManager$RemoteUserInfo {
    <init>(java.lang.String, int, int);
    <init>(java.lang.String, int, int, android.os.IBinder);

    public boolean equals(java.lang.Object);
    public java.lang.String getPackageName();
    public int getPid();
    public int getUid();
    public int hashCode();


}

-keep class android.media.session.ParcelableVolumeInfo {
    <init>(int, android.media.AudioAttributes, int, int, int);
    <init>(android.os.Parcel);

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.media.AudioAttributes audioAttrs;
    public int controlType;
    public int currentVolume;
    public int maxVolume;
    public int volumeType;
}

-keep class android.media.session.PlaybackState {

    public int describeContents();
    public long getActions();
    public static long getActionsFromRccControlFlags(int);
    public long getActiveQueueItemId();
    public long getBufferedPosition();
    public java.util.List getCustomActions();
    public java.lang.CharSequence getErrorMessage();
    public android.os.Bundle getExtras();
    public long getLastPositionUpdateTime();
    public float getPlaybackSpeed();
    public long getPosition();
    public static int getRccControlFlagsFromActions(long);
    public static int getRccStateFromState(int);
    public int getState();
    public static int getStateFromRccState(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static long ACTION_FAST_FORWARD;
    public static long ACTION_PAUSE;
    public static long ACTION_PLAY;
    public static long ACTION_PLAY_FROM_MEDIA_ID;
    public static long ACTION_PLAY_FROM_SEARCH;
    public static long ACTION_PLAY_FROM_URI;
    public static long ACTION_PLAY_PAUSE;
    public static long ACTION_PREPARE;
    public static long ACTION_PREPARE_FROM_MEDIA_ID;
    public static long ACTION_PREPARE_FROM_SEARCH;
    public static long ACTION_PREPARE_FROM_URI;
    public static long ACTION_REWIND;
    public static long ACTION_SEEK_TO;
    public static long ACTION_SET_RATING;
    public static long ACTION_SKIP_TO_NEXT;
    public static long ACTION_SKIP_TO_PREVIOUS;
    public static long ACTION_SKIP_TO_QUEUE_ITEM;
    public static long ACTION_STOP;
    public static android.os.Parcelable$Creator CREATOR;
    public static long PLAYBACK_POSITION_UNKNOWN;
    public static int STATE_BUFFERING;
    public static int STATE_CONNECTING;
    public static int STATE_ERROR;
    public static int STATE_FAST_FORWARDING;
    public static int STATE_NONE;
    public static int STATE_PAUSED;
    public static int STATE_PLAYING;
    public static int STATE_REWINDING;
    public static int STATE_SKIPPING_TO_NEXT;
    public static int STATE_SKIPPING_TO_PREVIOUS;
    public static int STATE_SKIPPING_TO_QUEUE_ITEM;
    public static int STATE_STOPPED;
}

-keep class android.media.session.PlaybackState$CustomAction {

    public int describeContents();
    public java.lang.String getAction();
    public android.os.Bundle getExtras();
    public int getIcon();
    public java.lang.CharSequence getName();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.media.update.SessionToken2Provider {

    public abstract boolean equals_impl(java.lang.Object);
    public abstract java.lang.String getId_imp();
    public abstract java.lang.String getPackageName_impl();
    public abstract int getType_impl();
    public abstract int getUid_impl();
    public abstract int hashCode_impl();
    public abstract android.os.Bundle toBundle_impl();
    public abstract java.lang.String toString_impl();


}

-keep class android.net.Uri {

    public abstract android.net.Uri$Builder buildUpon();
    public void checkContentUriWithoutPermission(java.lang.String, int);
    public void checkFileUriExposed(java.lang.String);
    public int compareTo(android.net.Uri);
    public int compareTo(java.lang.Object);
    public static java.lang.String decode(java.lang.String);
    public static java.lang.String encode(java.lang.String);
    public static java.lang.String encode(java.lang.String, java.lang.String);
    public boolean equals(java.lang.Object);
    public static android.net.Uri fromFile(java.io.File);
    public static android.net.Uri fromParts(java.lang.String, java.lang.String, java.lang.String);
    public abstract java.lang.String getAuthority();
    public boolean getBooleanQueryParameter(java.lang.String, boolean);
    public android.net.Uri getCanonicalUri();
    public abstract java.lang.String getEncodedAuthority();
    public abstract java.lang.String getEncodedFragment();
    public abstract java.lang.String getEncodedPath();
    public abstract java.lang.String getEncodedQuery();
    public abstract java.lang.String getEncodedSchemeSpecificPart();
    public abstract java.lang.String getEncodedUserInfo();
    public abstract java.lang.String getFragment();
    public abstract java.lang.String getHost();
    public abstract java.lang.String getLastPathSegment();
    public abstract java.lang.String getPath();
    public abstract java.util.List getPathSegments();
    public abstract int getPort();
    public abstract java.lang.String getQuery();
    public java.lang.String getQueryParameter(java.lang.String);
    public java.util.Set getQueryParameterNames();
    public java.util.List getQueryParameters(java.lang.String);
    public abstract java.lang.String getScheme();
    public abstract java.lang.String getSchemeSpecificPart();
    public abstract java.lang.String getUserInfo();
    public int hashCode();
    public boolean isAbsolute();
    public abstract boolean isHierarchical();
    public boolean isOpaque();
    public boolean isPathPrefixMatch(android.net.Uri);
    public abstract boolean isRelative();
    public android.net.Uri normalizeScheme();
    public static android.net.Uri parse(java.lang.String);
    public java.lang.String toSafeString();
    public abstract java.lang.String toString();
    public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
    public static void writeToParcel(android.os.Parcel, android.net.Uri);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.net.Uri EMPTY;
}

-keep class android.net.Uri$Builder {
    <init>();

    public android.net.Uri$Builder appendEncodedPath(java.lang.String);
    public android.net.Uri$Builder appendPath(java.lang.String);
    public android.net.Uri$Builder appendQueryParameter(java.lang.String, java.lang.String);
    public android.net.Uri$Builder authority(java.lang.String);
    public android.net.Uri build();
    public android.net.Uri$Builder clearQuery();
    public android.net.Uri$Builder encodedAuthority(java.lang.String);
    public android.net.Uri$Builder encodedFragment(java.lang.String);
    public android.net.Uri$Builder encodedOpaquePart(java.lang.String);
    public android.net.Uri$Builder encodedPath(java.lang.String);
    public android.net.Uri$Builder encodedQuery(java.lang.String);
    public android.net.Uri$Builder fragment(java.lang.String);
    public android.net.Uri$Builder opaquePart(java.lang.String);
    public android.net.Uri$Builder path(java.lang.String);
    public android.net.Uri$Builder query(java.lang.String);
    public android.net.Uri$Builder scheme(java.lang.String);
    public java.lang.String toString();


}

-keep class android.os.BaseBundle {

    public void clear();
    public boolean containsKey(java.lang.String);
    public static void dumpStats(com.android.internal.util.IndentingPrintWriter, java.lang.String, java.lang.Object);
    public static void dumpStats(com.android.internal.util.IndentingPrintWriter, android.util.SparseArray);
    public static void dumpStats(com.android.internal.util.IndentingPrintWriter, android.os.BaseBundle);
    public java.lang.Object get(java.lang.String);
    public boolean getBoolean(java.lang.String);
    public boolean getBoolean(java.lang.String, boolean);
    public boolean[] getBooleanArray(java.lang.String);
    public double getDouble(java.lang.String);
    public double getDouble(java.lang.String, double);
    public double[] getDoubleArray(java.lang.String);
    public int getInt(java.lang.String);
    public int getInt(java.lang.String, int);
    public int[] getIntArray(java.lang.String);
    public long getLong(java.lang.String);
    public long getLong(java.lang.String, long);
    public long[] getLongArray(java.lang.String);
    public java.lang.String getPairValue();
    public java.lang.String getString(java.lang.String);
    public java.lang.String getString(java.lang.String, java.lang.String);
    public java.lang.String[] getStringArray(java.lang.String);
    public boolean isEmpty();
    public boolean isEmptyParcel();
    public boolean isParcelled();
    public java.util.Set keySet();
    public static boolean kindofEquals(android.os.BaseBundle, android.os.BaseBundle);
    public boolean kindofEquals(android.os.BaseBundle);
    public boolean maybeIsEmpty();
    public void putAll(android.os.PersistableBundle);
    public void putBoolean(java.lang.String, boolean);
    public void putBooleanArray(java.lang.String, boolean[]);
    public void putDouble(java.lang.String, double);
    public void putDoubleArray(java.lang.String, double[]);
    public void putInt(java.lang.String, int);
    public void putIntArray(java.lang.String, int[]);
    public void putLong(java.lang.String, long);
    public void putLongArray(java.lang.String, long[]);
    public void putString(java.lang.String, java.lang.String);
    public void putStringArray(java.lang.String, java.lang.String[]);
    public void remove(java.lang.String);
    public static void setShouldDefuse(boolean);
    public int size();


    public int mFlags;
}

-keep class android.os.Binder {
    <init>();

    public static android.os.IBinder allowBlocking(android.os.IBinder);
    public void attachInterface(android.os.IInterface, java.lang.String);
    public static void blockUntilThreadAvailable();
    public static long clearCallingIdentity();
    public static void copyAllowBlocking(android.os.IBinder, android.os.IBinder);
    public static android.os.IBinder defaultBlocking(android.os.IBinder);
    public static void disableTracing();
    public void dump(java.io.FileDescriptor, java.lang.String[]);
    protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
    public static void enableTracing();
    public static void flushPendingCommands();
    public static int getCallingPid();
    public static int getCallingUid();
    public static android.os.UserHandle getCallingUserHandle();
    public java.lang.String getInterfaceDescriptor();
    public static int getThreadStrictModePolicy();
    public static synchronized android.os.TransactionTracker getTransactionTracker();
    public boolean isBinderAlive();
    public static boolean isProxy(android.os.IInterface);
    public static boolean isTracingEnabled();
    public static void joinThreadPool();
    public void linkToDeath(android.os.IBinder$DeathRecipient, int);
    public void onShellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    protected boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);
    public boolean pingBinder();
    public android.os.IInterface queryLocalInterface(java.lang.String);
    public static void restoreCallingIdentity(long);
    public static void setDumpDisabled(java.lang.String);
    public static void setThreadStrictModePolicy(int);
    public static void setWarnOnBlocking(boolean);
    public void shellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    public boolean transact(int, android.os.Parcel, android.os.Parcel, int);
    public boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);
    public static void withCleanCallingIdentity(com.android.internal.util.FunctionalUtils$ThrowingRunnable);
    public static java.lang.Object withCleanCallingIdentity(com.android.internal.util.FunctionalUtils$ThrowingSupplier);


    public static boolean CHECK_PARCEL_SIZE;
    public static boolean LOG_RUNTIME_EXCEPTION;
}

-keep class android.os.Bundle {
    <init>();
    <init>(android.os.Parcel);
    <init>(android.os.Parcel, int);
    <init>(java.lang.ClassLoader);
    <init>(int);
    <init>(android.os.Bundle);
    <init>(android.os.PersistableBundle);

    public void clear();
    public java.lang.Object clone();
    public android.os.Bundle deepCopy();
    public int describeContents();
    public android.os.Bundle filterValues();
    public static android.os.Bundle forPair(java.lang.String, java.lang.String);
    public android.os.IBinder getBinder(java.lang.String);
    public android.os.Bundle getBundle(java.lang.String);
    public byte getByte(java.lang.String);
    public java.lang.Byte getByte(java.lang.String, byte);
    public byte[] getByteArray(java.lang.String);
    public char getChar(java.lang.String);
    public char getChar(java.lang.String, char);
    public char[] getCharArray(java.lang.String);
    public java.lang.CharSequence getCharSequence(java.lang.String);
    public java.lang.CharSequence getCharSequence(java.lang.String, java.lang.CharSequence);
    public java.lang.CharSequence[] getCharSequenceArray(java.lang.String);
    public java.util.ArrayList getCharSequenceArrayList(java.lang.String);
    public java.lang.ClassLoader getClassLoader();
    public float getFloat(java.lang.String);
    public float getFloat(java.lang.String, float);
    public float[] getFloatArray(java.lang.String);
    public android.os.IBinder getIBinder(java.lang.String);
    public java.util.ArrayList getIntegerArrayList(java.lang.String);
    public android.os.Parcelable getParcelable(java.lang.String);
    public android.os.Parcelable[] getParcelableArray(java.lang.String);
    public java.util.ArrayList getParcelableArrayList(java.lang.String);
    public java.io.Serializable getSerializable(java.lang.String);
    public short getShort(java.lang.String);
    public short getShort(java.lang.String, short);
    public short[] getShortArray(java.lang.String);
    public int getSize();
    public android.util.Size getSize(java.lang.String);
    public android.util.SizeF getSizeF(java.lang.String);
    public android.util.SparseArray getSparseParcelableArray(java.lang.String);
    public java.util.ArrayList getStringArrayList(java.lang.String);
    public boolean hasFileDescriptors();
    public void putAll(android.os.Bundle);
    public void putBinder(java.lang.String, android.os.IBinder);
    public void putBundle(java.lang.String, android.os.Bundle);
    public void putByte(java.lang.String, byte);
    public void putByteArray(java.lang.String, byte[]);
    public void putChar(java.lang.String, char);
    public void putCharArray(java.lang.String, char[]);
    public void putCharSequence(java.lang.String, java.lang.CharSequence);
    public void putCharSequenceArray(java.lang.String, java.lang.CharSequence[]);
    public void putCharSequenceArrayList(java.lang.String, java.util.ArrayList);
    public void putFloat(java.lang.String, float);
    public void putFloatArray(java.lang.String, float[]);
    public void putIBinder(java.lang.String, android.os.IBinder);
    public void putIntegerArrayList(java.lang.String, java.util.ArrayList);
    public void putParcelable(java.lang.String, android.os.Parcelable);
    public void putParcelableArray(java.lang.String, android.os.Parcelable[]);
    public void putParcelableArrayList(java.lang.String, java.util.ArrayList);
    public void putParcelableList(java.lang.String, java.util.List);
    public void putSerializable(java.lang.String, java.io.Serializable);
    public void putShort(java.lang.String, short);
    public void putShortArray(java.lang.String, short[]);
    public void putSize(java.lang.String, android.util.Size);
    public void putSizeF(java.lang.String, android.util.SizeF);
    public void putSparseParcelableArray(java.lang.String, android.util.SparseArray);
    public void putStringArrayList(java.lang.String, java.util.ArrayList);
    public void readFromParcel(android.os.Parcel);
    public void remove(java.lang.String);
    public boolean setAllowFds(boolean);
    public void setClassLoader(java.lang.ClassLoader);
    public void setDefusable(boolean);
    public static android.os.Bundle setDefusable(android.os.Bundle, boolean);
    public synchronized java.lang.String toShortString();
    public synchronized java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.Bundle EMPTY;
    public static android.os.Bundle STRIPPED;
}

-keep class android.os.CancellationSignal {
    <init>();

    public void cancel();
    public static android.os.ICancellationSignal createTransport();
    public static android.os.CancellationSignal fromTransport(android.os.ICancellationSignal);
    public boolean isCanceled();
    public void setOnCancelListener(android.os.CancellationSignal$OnCancelListener);
    public void setRemote(android.os.ICancellationSignal);
    public void throwIfCanceled();


}

-keep class android.os.CancellationSignal$OnCancelListener {

    public abstract void onCancel();


}

-keep class android.os.Debug {

    public static void attachJvmtiAgent(java.lang.String, java.lang.String, java.lang.ClassLoader);
    public static boolean cacheRegisterMap(java.lang.String);
    public static void changeDebugPort(int);
    public static long countInstancesOfClass(java.lang.Class);
    public static void dumpHprofData(java.lang.String);
    public static void dumpHprofData(java.lang.String, java.io.FileDescriptor);
    public static void dumpHprofDataDdms();
    public static boolean dumpJavaBacktraceToFileTimeout(int, java.lang.String, int);
    public static boolean dumpNativeBacktraceToFileTimeout(int, java.lang.String, int);
    public static void dumpNativeHeap(java.io.FileDescriptor);
    public static void dumpNativeMallocInfo(java.io.FileDescriptor);
    public static void dumpReferenceTables();
    public static boolean dumpService(java.lang.String, java.io.FileDescriptor, java.lang.String[]);
    public static void enableEmulatorTraceOutput();
    public static int getBinderDeathObjectCount();
    public static int getBinderLocalObjectCount();
    public static int getBinderProxyObjectCount();
    public static int getBinderReceivedTransactions();
    public static int getBinderSentTransactions();
    public static java.lang.String getCaller();
    public static java.lang.String getCallers(int);
    public static java.lang.String getCallers(int, int);
    public static java.lang.String getCallers(int, java.lang.String);
    public static int getGlobalAllocCount();
    public static int getGlobalAllocSize();
    public static int getGlobalClassInitCount();
    public static int getGlobalClassInitTime();
    public static int getGlobalExternalAllocCount();
    public static int getGlobalExternalAllocSize();
    public static int getGlobalExternalFreedCount();
    public static int getGlobalExternalFreedSize();
    public static int getGlobalFreedCount();
    public static int getGlobalFreedSize();
    public static int getGlobalGcInvocationCount();
    public static int getLoadedClassCount();
    public static void getMemInfo(long[]);
    public static void getMemoryInfo(android.os.Debug$MemoryInfo);
    public static void getMemoryInfo(int, android.os.Debug$MemoryInfo);
    public static int getMethodTracingMode();
    public static long getNativeHeapAllocatedSize();
    public static long getNativeHeapFreeSize();
    public static long getNativeHeapSize();
    public static long getPss();
    public static long getPss(int, long[], long[]);
    public static java.lang.String getRuntimeStat(java.lang.String);
    public static java.util.Map getRuntimeStats();
    public static int getThreadAllocCount();
    public static int getThreadAllocSize();
    public static int getThreadExternalAllocCount();
    public static int getThreadExternalAllocSize();
    public static int getThreadGcInvocationCount();
    public static java.lang.String getUnreachableMemory(int, boolean);
    public static java.lang.String[] getVmFeatureList();
    public static boolean isDebuggerConnected();
    public static void printLoadedClasses(int);
    public static void resetAllCounts();
    public static void resetGlobalAllocCount();
    public static void resetGlobalAllocSize();
    public static void resetGlobalClassInitCount();
    public static void resetGlobalClassInitTime();
    public static void resetGlobalExternalAllocCount();
    public static void resetGlobalExternalAllocSize();
    public static void resetGlobalExternalFreedCount();
    public static void resetGlobalExternalFreedSize();
    public static void resetGlobalFreedCount();
    public static void resetGlobalFreedSize();
    public static void resetGlobalGcInvocationCount();
    public static void resetThreadAllocCount();
    public static void resetThreadAllocSize();
    public static void resetThreadExternalAllocCount();
    public static void resetThreadExternalAllocSize();
    public static void resetThreadGcInvocationCount();
    public static int setAllocationLimit(int);
    public static void setFieldsOn(java.lang.Class);
    public static void setFieldsOn(java.lang.Class, boolean);
    public static int setGlobalAllocationLimit(int);
    public static void startAllocCounting();
    public static void startMethodTracing();
    public static void startMethodTracing(java.lang.String);
    public static void startMethodTracing(java.lang.String, int);
    public static void startMethodTracing(java.lang.String, int, int);
    public static void startMethodTracing(java.lang.String, java.io.FileDescriptor, int, int, boolean);
    public static void startMethodTracingDdms(int, int, boolean, int);
    public static void startMethodTracingSampling(java.lang.String, int, int);
    public static void startNativeTracing();
    public static void stopAllocCounting();
    public static void stopMethodTracing();
    public static void stopNativeTracing();
    public static long threadCpuTimeNanos();
    public static void waitForDebugger();
    public static boolean waitingForDebugger();


    public static int MEMINFO_BUFFERS;
    public static int MEMINFO_CACHED;
    public static int MEMINFO_COUNT;
    public static int MEMINFO_FREE;
    public static int MEMINFO_KERNEL_STACK;
    public static int MEMINFO_MAPPED;
    public static int MEMINFO_PAGE_TABLES;
    public static int MEMINFO_SHMEM;
    public static int MEMINFO_SLAB;
    public static int MEMINFO_SLAB_RECLAIMABLE;
    public static int MEMINFO_SLAB_UNRECLAIMABLE;
    public static int MEMINFO_SWAP_FREE;
    public static int MEMINFO_SWAP_TOTAL;
    public static int MEMINFO_TOTAL;
    public static int MEMINFO_VM_ALLOC_USED;
    public static int MEMINFO_ZRAM_TOTAL;
    public static int SHOW_CLASSLOADER;
    public static int SHOW_FULL_DETAIL;
    public static int SHOW_INITIALIZED;
    public static int TRACE_COUNT_ALLOCS;
}

-keep class android.os.Debug$MemoryInfo {
    <init>();

    public int describeContents();
    public java.lang.String getMemoryStat(java.lang.String);
    public java.util.Map getMemoryStats();
    public static java.lang.String getOtherLabel(int);
    public int getOtherPrivate(int);
    public int getOtherPrivateClean(int);
    public int getOtherPrivateDirty(int);
    public int getOtherPss(int);
    public int getOtherRss(int);
    public int getOtherSharedClean(int);
    public int getOtherSharedDirty(int);
    public int getOtherSwappablePss(int);
    public int getOtherSwappedOut(int);
    public int getOtherSwappedOutPss(int);
    public int getSummaryCode();
    public int getSummaryGraphics();
    public int getSummaryJavaHeap();
    public int getSummaryNativeHeap();
    public int getSummaryPrivateOther();
    public int getSummaryStack();
    public int getSummarySystem();
    public int getSummaryTotalPss();
    public int getSummaryTotalSwap();
    public int getSummaryTotalSwapPss();
    public int getTotalPrivateClean();
    public int getTotalPrivateDirty();
    public int getTotalPss();
    public int getTotalRss();
    public int getTotalSharedClean();
    public int getTotalSharedDirty();
    public int getTotalSwappablePss();
    public int getTotalSwappedOut();
    public int getTotalSwappedOutPss();
    public int getTotalUss();
    public boolean hasSwappedOutPss();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int HEAP_DALVIK;
    public static int HEAP_NATIVE;
    public static int HEAP_UNKNOWN;
    public static int NUM_CATEGORIES;
    public static int NUM_DVK_STATS;
    public static int NUM_OTHER_STATS;
    public static int OFFSET_PRIVATE_CLEAN;
    public static int OFFSET_PRIVATE_DIRTY;
    public static int OFFSET_PSS;
    public static int OFFSET_RSS;
    public static int OFFSET_SHARED_CLEAN;
    public static int OFFSET_SHARED_DIRTY;
    public static int OFFSET_SWAPPABLE_PSS;
    public static int OFFSET_SWAPPED_OUT;
    public static int OFFSET_SWAPPED_OUT_PSS;
    public static int OTHER_APK;
    public static int OTHER_ART;
    public static int OTHER_ART_APP;
    public static int OTHER_ART_BOOT;
    public static int OTHER_ASHMEM;
    public static int OTHER_CURSOR;
    public static int OTHER_DALVIK_LARGE;
    public static int OTHER_DALVIK_NON_MOVING;
    public static int OTHER_DALVIK_NORMAL;
    public static int OTHER_DALVIK_OTHER;
    public static int OTHER_DALVIK_OTHER_ACCOUNTING;
    public static int OTHER_DALVIK_OTHER_CODE_CACHE;
    public static int OTHER_DALVIK_OTHER_COMPILER_METADATA;
    public static int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE;
    public static int OTHER_DALVIK_OTHER_LINEARALLOC;
    public static int OTHER_DALVIK_ZYGOTE;
    public static int OTHER_DEX;
    public static int OTHER_DEX_APP_DEX;
    public static int OTHER_DEX_APP_VDEX;
    public static int OTHER_DEX_BOOT_VDEX;
    public static int OTHER_DVK_STAT_ART_END;
    public static int OTHER_DVK_STAT_ART_START;
    public static int OTHER_DVK_STAT_DALVIK_END;
    public static int OTHER_DVK_STAT_DALVIK_OTHER_END;
    public static int OTHER_DVK_STAT_DALVIK_OTHER_START;
    public static int OTHER_DVK_STAT_DALVIK_START;
    public static int OTHER_DVK_STAT_DEX_END;
    public static int OTHER_DVK_STAT_DEX_START;
    public static int OTHER_GL;
    public static int OTHER_GL_DEV;
    public static int OTHER_GRAPHICS;
    public static int OTHER_JAR;
    public static int OTHER_OAT;
    public static int OTHER_OTHER_MEMTRACK;
    public static int OTHER_SO;
    public static int OTHER_STACK;
    public static int OTHER_TTF;
    public static int OTHER_UNKNOWN_DEV;
    public static int OTHER_UNKNOWN_MAP;
    public int dalvikPrivateClean;
    public int dalvikPrivateDirty;
    public int dalvikPss;
    public int dalvikRss;
    public int dalvikSharedClean;
    public int dalvikSharedDirty;
    public int dalvikSwappablePss;
    public int dalvikSwappedOut;
    public int dalvikSwappedOutPss;
    public boolean hasSwappedOutPss;
    public int nativePrivateClean;
    public int nativePrivateDirty;
    public int nativePss;
    public int nativeRss;
    public int nativeSharedClean;
    public int nativeSharedDirty;
    public int nativeSwappablePss;
    public int nativeSwappedOut;
    public int nativeSwappedOutPss;
    public int otherPrivateClean;
    public int otherPrivateDirty;
    public int otherPss;
    public int otherRss;
    public int otherSharedClean;
    public int otherSharedDirty;
    public int otherSwappablePss;
    public int otherSwappedOut;
    public int otherSwappedOutPss;
}

-keep class android.os.Handler {
    <init>();
    <init>(android.os.Handler$Callback);
    <init>(android.os.Looper);
    <init>(android.os.Looper, android.os.Handler$Callback);
    <init>(boolean);
    <init>(android.os.Handler$Callback, boolean);
    <init>(android.os.Looper, android.os.Handler$Callback, boolean);

    public static android.os.Handler createAsync(android.os.Looper);
    public static android.os.Handler createAsync(android.os.Looper, android.os.Handler$Callback);
    public void dispatchMessage(android.os.Message);
    public void dump(android.util.Printer, java.lang.String);
    public void dumpMine(android.util.Printer, java.lang.String);
    public boolean executeOrSendMessage(android.os.Message);
    public android.os.Looper getLooper();
    public static android.os.Handler getMain();
    public java.lang.String getMessageName(android.os.Message);
    public java.lang.String getTraceName(android.os.Message);
    public void handleMessage(android.os.Message);
    public boolean hasCallbacks(java.lang.Runnable);
    public boolean hasMessages(int);
    public boolean hasMessages(int, java.lang.Object);
    public boolean hasMessagesOrCallbacks();
    public static android.os.Handler mainIfNull(android.os.Handler);
    public android.os.Message obtainMessage();
    public android.os.Message obtainMessage(int);
    public android.os.Message obtainMessage(int, java.lang.Object);
    public android.os.Message obtainMessage(int, int, int);
    public android.os.Message obtainMessage(int, int, int, java.lang.Object);
    public boolean post(java.lang.Runnable);
    public boolean postAtFrontOfQueue(java.lang.Runnable);
    public boolean postAtTime(java.lang.Runnable, long);
    public boolean postAtTime(java.lang.Runnable, java.lang.Object, long);
    public boolean postDelayed(java.lang.Runnable, long);
    public boolean postDelayed(java.lang.Runnable, java.lang.Object, long);
    public void removeCallbacks(java.lang.Runnable);
    public void removeCallbacks(java.lang.Runnable, java.lang.Object);
    public void removeCallbacksAndMessages(java.lang.Object);
    public void removeMessages(int);
    public void removeMessages(int, java.lang.Object);
    public boolean runWithScissors(java.lang.Runnable, long);
    public boolean sendEmptyMessage(int);
    public boolean sendEmptyMessageAtTime(int, long);
    public boolean sendEmptyMessageDelayed(int, long);
    public boolean sendMessage(android.os.Message);
    public boolean sendMessageAtFrontOfQueue(android.os.Message);
    public boolean sendMessageAtTime(android.os.Message, long);
    public boolean sendMessageDelayed(android.os.Message, long);
    public java.lang.String toString();


}

-keep class android.os.Handler$Callback {

    public abstract boolean handleMessage(android.os.Message);


}

-keep class android.os.IBinder {

    public abstract void dump(java.io.FileDescriptor, java.lang.String[]);
    public abstract void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
    public abstract java.lang.String getInterfaceDescriptor();
    public abstract boolean isBinderAlive();
    public abstract void linkToDeath(android.os.IBinder$DeathRecipient, int);
    public abstract boolean pingBinder();
    public abstract android.os.IInterface queryLocalInterface(java.lang.String);
    public abstract void shellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    public abstract boolean transact(int, android.os.Parcel, android.os.Parcel, int);
    public abstract boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);


    public static int DUMP_TRANSACTION;
    public static int FIRST_CALL_TRANSACTION;
    public static int FLAG_ONEWAY;
    public static int INTERFACE_TRANSACTION;
    public static int LAST_CALL_TRANSACTION;
    public static int LIKE_TRANSACTION;
    public static int MAX_IPC_SIZE;
    public static int PING_TRANSACTION;
    public static int SHELL_COMMAND_TRANSACTION;
    public static int SYSPROPS_TRANSACTION;
    public static int TWEET_TRANSACTION;
}

-keep class android.os.IBinder$DeathRecipient {

    public abstract void binderDied();


}

-keep class android.os.ICancellationSignal {

    public abstract void cancel();


}

-keep class android.os.IInterface {

    public abstract android.os.IBinder asBinder();


}

-keep class android.os.IProgressListener {

    public abstract void onFinished(int, android.os.Bundle);
    public abstract void onProgress(int, int, android.os.Bundle);
    public abstract void onStarted(int, android.os.Bundle);


}

-keep class android.os.IRemoteCallback {

    public abstract void sendResult(android.os.Bundle);


}

-keep class android.os.LocaleList {
    <init>(java.util.Locale[]);
    <init>(java.util.Locale, android.os.LocaleList);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.os.LocaleList forLanguageTags(java.lang.String);
    public java.util.Locale get(int);
    public static android.os.LocaleList getAdjustedDefault();
    public static android.os.LocaleList getDefault();
    public static android.os.LocaleList getEmptyLocaleList();
    public java.util.Locale getFirstMatch(java.lang.String[]);
    public int getFirstMatchIndex(java.lang.String[]);
    public int getFirstMatchIndexWithEnglishSupported(java.util.Collection);
    public int getFirstMatchIndexWithEnglishSupported(java.lang.String[]);
    public java.util.Locale getFirstMatchWithEnglishSupported(java.lang.String[]);
    public int hashCode();
    public int indexOf(java.util.Locale);
    public boolean isEmpty();
    public static boolean isPseudoLocale(java.util.Locale);
    public static boolean isPseudoLocalesOnly(java.lang.String[]);
    public static void setDefault(android.os.LocaleList);
    public static void setDefault(android.os.LocaleList, int);
    public int size();
    public java.lang.String toLanguageTags();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.Looper {

    public void dump(android.util.Printer, java.lang.String);
    public void dump(android.util.Printer, java.lang.String, android.os.Handler);
    public static android.os.Looper getMainLooper();
    public android.os.MessageQueue getQueue();
    public java.lang.Thread getThread();
    public boolean isCurrentThread();
    public static void loop();
    public static android.os.Looper myLooper();
    public static android.os.MessageQueue myQueue();
    public static void prepare();
    public static void prepareMainLooper();
    public void quit();
    public void quitSafely();
    public void setMessageLogging(android.util.Printer);
    public void setSlowLogThresholdMs(long, long);
    public void setTraceTag(long);
    public java.lang.String toString();
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


}

-keep class android.os.Message {
    <init>();

    public void copyFrom(android.os.Message);
    public int describeContents();
    public java.lang.Runnable getCallback();
    public android.os.Bundle getData();
    public android.os.Handler getTarget();
    public long getWhen();
    public boolean isAsynchronous();
    public static android.os.Message obtain();
    public static android.os.Message obtain(android.os.Message);
    public static android.os.Message obtain(android.os.Handler);
    public static android.os.Message obtain(android.os.Handler, java.lang.Runnable);
    public static android.os.Message obtain(android.os.Handler, int);
    public static android.os.Message obtain(android.os.Handler, int, java.lang.Object);
    public static android.os.Message obtain(android.os.Handler, int, int, int);
    public static android.os.Message obtain(android.os.Handler, int, int, int, java.lang.Object);
    public android.os.Bundle peekData();
    public void recycle();
    public void sendToTarget();
    public void setAsynchronous(boolean);
    public android.os.Message setCallback(java.lang.Runnable);
    public void setData(android.os.Bundle);
    public void setTarget(android.os.Handler);
    public android.os.Message setWhat(int);
    public java.lang.String toString();
    public static void updateCheckRecycle(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int arg1;
    public int arg2;
    public java.lang.Object obj;
    public android.os.Messenger replyTo;
    public static java.lang.Object sPoolSync;
    public int sendingUid;
    public int what;
}

-keep class android.os.MessageQueue {

    public void addIdleHandler(android.os.MessageQueue$IdleHandler);
    public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue$OnFileDescriptorEventListener);
    protected void finalize();
    public boolean isIdle();
    public boolean isPolling();
    public int postSyncBarrier();
    public void removeIdleHandler(android.os.MessageQueue$IdleHandler);
    public void removeOnFileDescriptorEventListener(java.io.FileDescriptor);
    public void removeSyncBarrier(int);


}

-keep class android.os.MessageQueue$IdleHandler {

    public abstract boolean queueIdle();


}

-keep class android.os.MessageQueue$OnFileDescriptorEventListener {

    public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int);


    public static int EVENT_ERROR;
    public static int EVENT_INPUT;
    public static int EVENT_OUTPUT;
}

-keep class android.os.Messenger {
    <init>(android.os.Handler);
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.os.IBinder getBinder();
    public int hashCode();
    public static android.os.Messenger readMessengerOrNullFromParcel(android.os.Parcel);
    public void send(android.os.Message);
    public static void writeMessengerOrNullToParcel(android.os.Messenger, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.Parcel {

    public void adoptClassCookies(android.os.Parcel);
    public void appendFrom(android.os.Parcel, int, int);
    public int compareData(android.os.Parcel);
    public java.util.Map copyClassCookies();
    public android.os.IBinder[] createBinderArray();
    public java.util.ArrayList createBinderArrayList();
    public boolean[] createBooleanArray();
    public byte[] createByteArray();
    public char[] createCharArray();
    public double[] createDoubleArray();
    public float[] createFloatArray();
    public int[] createIntArray();
    public long[] createLongArray();
    public java.io.FileDescriptor[] createRawFileDescriptorArray();
    public java.lang.String[] createStringArray();
    public java.util.ArrayList createStringArrayList();
    public java.lang.Object[] createTypedArray(android.os.Parcelable$Creator);
    public java.util.ArrayList createTypedArrayList(android.os.Parcelable$Creator);
    public int dataAvail();
    public int dataCapacity();
    public int dataPosition();
    public int dataSize();
    public void enforceInterface(java.lang.String);
    protected void finalize();
    public long getBlobAshmemSize();
    public java.lang.Object getClassCookie(java.lang.Class);
    public static long getGlobalAllocCount();
    public static long getGlobalAllocSize();
    public boolean hasFileDescriptors();
    public boolean hasReadWriteHelper();
    public byte[] marshall();
    public static android.os.Parcel obtain();
    protected static android.os.Parcel obtain(int);
    protected static android.os.Parcel obtain(long);
    public boolean pushAllowFds(boolean);
    public void putClassCookies(java.util.Map);
    public java.lang.Object[] readArray(java.lang.ClassLoader);
    public java.util.ArrayList readArrayList(java.lang.ClassLoader);
    public void readArrayMap(android.util.ArrayMap, java.lang.ClassLoader);
    public android.util.ArraySet readArraySet(java.lang.ClassLoader);
    public void readBinderArray(android.os.IBinder[]);
    public void readBinderList(java.util.List);
    public byte[] readBlob();
    public boolean readBoolean();
    public void readBooleanArray(boolean[]);
    public android.os.Bundle readBundle();
    public android.os.Bundle readBundle(java.lang.ClassLoader);
    public byte readByte();
    public void readByteArray(byte[]);
    public void readCharArray(char[]);
    public java.lang.CharSequence readCharSequence();
    public java.lang.CharSequence[] readCharSequenceArray();
    public java.util.ArrayList readCharSequenceList();
    public android.os.Parcelable readCreator(android.os.Parcelable$Creator, java.lang.ClassLoader);
    public double readDouble();
    public void readDoubleArray(double[]);
    public void readException();
    public void readException(int, java.lang.String);
    public int readExceptionCode();
    public android.os.ParcelFileDescriptor readFileDescriptor();
    public float readFloat();
    public void readFloatArray(float[]);
    public java.util.HashMap readHashMap(java.lang.ClassLoader);
    public int readInt();
    public void readIntArray(int[]);
    public void readList(java.util.List, java.lang.ClassLoader);
    public long readLong();
    public void readLongArray(long[]);
    public void readMap(java.util.Map, java.lang.ClassLoader);
    public android.os.Parcelable readParcelable(java.lang.ClassLoader);
    public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
    public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader, java.lang.Class);
    public android.os.Parcelable$Creator readParcelableCreator(java.lang.ClassLoader);
    public java.util.List readParcelableList(java.util.List, java.lang.ClassLoader);
    public android.os.PersistableBundle readPersistableBundle();
    public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
    public java.io.FileDescriptor readRawFileDescriptor();
    public void readRawFileDescriptorArray(java.io.FileDescriptor[]);
    public java.io.Serializable readSerializable();
    public android.util.Size readSize();
    public android.util.SizeF readSizeF();
    public android.util.SparseArray readSparseArray(java.lang.ClassLoader);
    public android.util.SparseBooleanArray readSparseBooleanArray();
    public android.util.SparseIntArray readSparseIntArray();
    public java.lang.String readString();
    public void readStringArray(java.lang.String[]);
    public java.lang.String[] readStringArray();
    public void readStringList(java.util.List);
    public java.lang.String readStringNoHelper();
    public android.os.IBinder readStrongBinder();
    public void readTypedArray(java.lang.Object[], android.os.Parcelable$Creator);
    public java.lang.Object[] readTypedArray(android.os.Parcelable$Creator);
    public void readTypedList(java.util.List, android.os.Parcelable$Creator);
    public java.lang.Object readTypedObject(android.os.Parcelable$Creator);
    public java.lang.Object readValue(java.lang.ClassLoader);
    public void recycle();
    public void restoreAllowFds(boolean);
    public void setClassCookie(java.lang.Class, java.lang.Object);
    public void setDataCapacity(int);
    public void setDataPosition(int);
    public void setDataSize(int);
    public void setReadWriteHelper(android.os.Parcel$ReadWriteHelper);
    public static void setStackTraceParceling(boolean);
    public void unmarshall(byte[], int, int);
    public void writeArray(java.lang.Object[]);
    public void writeArrayMap(android.util.ArrayMap);
    public void writeArraySet(android.util.ArraySet);
    public void writeBinderArray(android.os.IBinder[]);
    public void writeBinderList(java.util.List);
    public void writeBlob(byte[]);
    public void writeBlob(byte[], int, int);
    public void writeBoolean(boolean);
    public void writeBooleanArray(boolean[]);
    public void writeBundle(android.os.Bundle);
    public void writeByte(byte);
    public void writeByteArray(byte[]);
    public void writeByteArray(byte[], int, int);
    public void writeCharArray(char[]);
    public void writeCharSequence(java.lang.CharSequence);
    public void writeCharSequenceArray(java.lang.CharSequence[]);
    public void writeCharSequenceList(java.util.ArrayList);
    public void writeDouble(double);
    public void writeDoubleArray(double[]);
    public void writeException(java.lang.Exception);
    public void writeFileDescriptor(java.io.FileDescriptor);
    public void writeFloat(float);
    public void writeFloatArray(float[]);
    public void writeInt(int);
    public void writeIntArray(int[]);
    public void writeInterfaceToken(java.lang.String);
    public void writeList(java.util.List);
    public void writeLong(long);
    public void writeLongArray(long[]);
    public void writeMap(java.util.Map);
    public void writeNoException();
    public void writeParcelable(android.os.Parcelable, int);
    public void writeParcelableArray(android.os.Parcelable[], int);
    public void writeParcelableCreator(android.os.Parcelable);
    public void writeParcelableList(java.util.List, int);
    public void writePersistableBundle(android.os.PersistableBundle);
    public void writeRawFileDescriptor(java.io.FileDescriptor);
    public void writeRawFileDescriptorArray(java.io.FileDescriptor[]);
    public void writeSerializable(java.io.Serializable);
    public void writeSize(android.util.Size);
    public void writeSizeF(android.util.SizeF);
    public void writeSparseArray(android.util.SparseArray);
    public void writeSparseBooleanArray(android.util.SparseBooleanArray);
    public void writeSparseIntArray(android.util.SparseIntArray);
    public void writeString(java.lang.String);
    public void writeStringArray(java.lang.String[]);
    public void writeStringList(java.util.List);
    public void writeStringNoHelper(java.lang.String);
    public void writeStrongBinder(android.os.IBinder);
    public void writeStrongInterface(android.os.IInterface);
    public void writeTypedArray(android.os.Parcelable[], int);
    public void writeTypedList(java.util.List);
    public void writeTypedList(java.util.List, int);
    public void writeTypedObject(android.os.Parcelable, int);
    public void writeValue(java.lang.Object);


    public static android.os.Parcelable$Creator STRING_CREATOR;
}

-keep class android.os.Parcel$ReadWriteHelper {
    <init>();

    public java.lang.String readString(android.os.Parcel);
    public void writeString(android.os.Parcel, java.lang.String);


    public static android.os.Parcel$ReadWriteHelper DEFAULT;
}

-keep class android.os.ParcelFileDescriptor {
    <init>(android.os.ParcelFileDescriptor);
    <init>(java.io.FileDescriptor);
    <init>(java.io.FileDescriptor, java.io.FileDescriptor);

    public static android.os.ParcelFileDescriptor adoptFd(int);
    public boolean canDetectErrors();
    public void checkError();
    public void close();
    public void closeWithError(java.lang.String);
    public static android.os.ParcelFileDescriptor[] createPipe();
    public static android.os.ParcelFileDescriptor[] createReliablePipe();
    public static android.os.ParcelFileDescriptor[] createReliableSocketPair();
    public static android.os.ParcelFileDescriptor[] createReliableSocketPair(int);
    public static android.os.ParcelFileDescriptor[] createSocketPair();
    public static android.os.ParcelFileDescriptor[] createSocketPair(int);
    public int describeContents();
    public int detachFd();
    public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor);
    public android.os.ParcelFileDescriptor dup();
    protected void finalize();
    public static android.os.ParcelFileDescriptor fromData(byte[], java.lang.String);
    public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
    public static android.os.ParcelFileDescriptor fromFd(java.io.FileDescriptor, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
    public static android.os.ParcelFileDescriptor fromFd(int);
    public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
    public int getFd();
    public static java.io.File getFile(java.io.FileDescriptor);
    public java.io.FileDescriptor getFileDescriptor();
    public long getStatSize();
    public static android.os.ParcelFileDescriptor open(java.io.File, int);
    public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
    public static int parseMode(java.lang.String);
    public void releaseResources();
    public long seekTo(long);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MODE_APPEND;
    public static int MODE_CREATE;
    public static int MODE_READ_ONLY;
    public static int MODE_READ_WRITE;
    public static int MODE_TRUNCATE;
    public static int MODE_WORLD_READABLE;
    public static int MODE_WORLD_WRITEABLE;
    public static int MODE_WRITE_ONLY;
}

-keep class android.os.ParcelFileDescriptor$OnCloseListener {

    public abstract void onClose(java.io.IOException);


}

-keep class android.os.Parcelable {

    public abstract int describeContents();
    public abstract void writeToParcel(android.os.Parcel, int);


    public static int CONTENTS_FILE_DESCRIPTOR;
    public static int PARCELABLE_ELIDE_DUPLICATES;
    public static int PARCELABLE_WRITE_RETURN_VALUE;
}

-keep class android.os.Parcelable$ClassLoaderCreator {

    public abstract java.lang.Object createFromParcel(android.os.Parcel, java.lang.ClassLoader);


}

-keep class android.os.Parcelable$Creator {

    public abstract java.lang.Object createFromParcel(android.os.Parcel);
    public abstract java.lang.Object[] newArray(int);


}

-keep class android.os.PatternMatcher {
    <init>(java.lang.String, int);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.lang.String getPath();
    public int getType();
    public boolean match(java.lang.String);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static int PATTERN_ADVANCED_GLOB;
    public static int PATTERN_LITERAL;
    public static int PATTERN_PREFIX;
    public static int PATTERN_SIMPLE_GLOB;
}

-keep class android.os.PersistableBundle {
    <init>();
    <init>(int);
    <init>(android.os.PersistableBundle);
    <init>(android.os.Bundle);

    public java.lang.Object clone();
    public android.os.PersistableBundle deepCopy();
    public int describeContents();
    public static android.os.PersistableBundle forPair(java.lang.String, java.lang.String);
    public android.os.PersistableBundle getPersistableBundle(java.lang.String);
    public static boolean isValidType(java.lang.Object);
    public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
    public static android.os.PersistableBundle restoreFromXml(org.xmlpull.v1.XmlPullParser);
    public void saveToXml(org.xmlpull.v1.XmlSerializer);
    public synchronized java.lang.String toShortString();
    public synchronized java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);
    public void writeUnknownObject(java.lang.Object, java.lang.String, org.xmlpull.v1.XmlSerializer);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.PersistableBundle EMPTY;
}

-keep class android.os.RemoteException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);

    public java.lang.RuntimeException rethrowAsRuntimeException();
    public java.lang.RuntimeException rethrowFromSystemServer();


}

-keep class android.os.ResultReceiver {
    <init>(android.os.Handler);

    public int describeContents();
    protected void onReceiveResult(int, android.os.Bundle);
    public void send(int, android.os.Bundle);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.ShellCallback {
    <init>();

    public int describeContents();
    public android.os.ParcelFileDescriptor onOpenFile(java.lang.String, java.lang.String, java.lang.String);
    public android.os.ParcelFileDescriptor openFile(java.lang.String, java.lang.String, java.lang.String);
    public static void writeToParcel(android.os.ShellCallback, android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.ShellCommand {
    <init>();

    public android.os.ResultReceiver adoptResultReceiver();
    public int exec(android.os.Binder, java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
    public java.io.InputStream getBufferedInputStream();
    public java.io.FileDescriptor getErrFileDescriptor();
    public java.io.PrintWriter getErrPrintWriter();
    public java.io.FileDescriptor getInFileDescriptor();
    public java.lang.String getNextArg();
    public java.lang.String getNextArgRequired();
    public java.lang.String getNextOption();
    public java.io.FileDescriptor getOutFileDescriptor();
    public java.io.PrintWriter getOutPrintWriter();
    public java.io.OutputStream getRawErrorStream();
    public java.io.InputStream getRawInputStream();
    public java.io.OutputStream getRawOutputStream();
    public android.os.ShellCallback getShellCallback();
    public int handleDefaultCommands(java.lang.String);
    public void init(android.os.Binder, java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, int);
    public abstract int onCommand(java.lang.String);
    public abstract void onHelp();
    public android.os.ParcelFileDescriptor openFileForSystem(java.lang.String, java.lang.String);
    public java.lang.String peekNextArg();


}

-keep class android.os.StrictMode {

    public static android.os.StrictMode$ThreadPolicy allowThreadDiskReads();
    public static int allowThreadDiskReadsMask();
    public static android.os.StrictMode$ThreadPolicy allowThreadDiskWrites();
    public static int allowThreadDiskWritesMask();
    public static void conditionallyCheckInstanceCounts();
    public static void decrementExpectedActivityCount(java.lang.Class);
    public static void disableDeathOnFileUriExposure();
    public static void enableDeathOnFileUriExposure();
    public static void enableDefaults();
    public static android.os.StrictMode$Span enterCriticalSpan(java.lang.String);
    public static android.os.StrictMode$ThreadPolicy getThreadPolicy();
    public static int getThreadPolicyMask();
    public static android.os.StrictMode$VmPolicy getVmPolicy();
    public static void incrementExpectedActivityCount(java.lang.Class);
    public static void initThreadDefaults(android.content.pm.ApplicationInfo);
    public static void initVmDefaults(android.content.pm.ApplicationInfo);
    public static boolean isBundledSystemApp(android.content.pm.ApplicationInfo);
    public static void noteDiskRead();
    public static void noteDiskWrite();
    public static void noteResourceMismatch(java.lang.Object);
    public static void noteSlowCall(java.lang.String);
    public static void noteUnbufferedIO();
    public static void onCleartextNetworkDetected(byte[]);
    public static void onContentUriWithoutPermission(android.net.Uri, java.lang.String);
    public static void onFileUriExposed(android.net.Uri, java.lang.String);
    public static void onIntentReceiverLeaked(java.lang.Throwable);
    public static void onServiceConnectionLeaked(java.lang.Throwable);
    public static void onSqliteObjectLeaked(java.lang.String, java.lang.Throwable);
    public static void onUntaggedSocket();
    public static void onVmPolicyViolation(android.os.strictmode.Violation);
    public static void onVmPolicyViolation(android.os.strictmode.Violation, boolean);
    public static void onWebViewMethodCalledOnWrongThread(java.lang.Throwable);
    public static void setThreadPolicy(android.os.StrictMode$ThreadPolicy);
    public static void setThreadPolicyMask(int);
    public static void setViolationLogger(android.os.StrictMode$ViolationLogger);
    public static void setVmPolicy(android.os.StrictMode$VmPolicy);
    public static java.lang.Object trackActivity(java.lang.Object);
    public static boolean vmCleartextNetworkEnabled();
    public static boolean vmClosableObjectLeaksEnabled();
    public static boolean vmContentUriWithoutPermissionEnabled();
    public static boolean vmFileUriExposureEnabled();
    public static boolean vmRegistrationLeaksEnabled();
    public static boolean vmSqliteObjectLeaksEnabled();
    public static boolean vmUntaggedSocketEnabled();


    public static java.lang.String CLEARTEXT_DETECTED_MSG;
    public static int DETECT_CUSTOM;
    public static int DETECT_DISK_READ;
    public static int DETECT_DISK_WRITE;
    public static int DETECT_NETWORK;
    public static int DETECT_RESOURCE_MISMATCH;
    public static int DETECT_UNBUFFERED_IO;
    public static int DETECT_VM_ACTIVITY_LEAKS;
    public static int DETECT_VM_CLEARTEXT_NETWORK;
    public static int DETECT_VM_CLOSABLE_LEAKS;
    public static int DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION;
    public static int DETECT_VM_CURSOR_LEAKS;
    public static int DETECT_VM_FILE_URI_EXPOSURE;
    public static int DETECT_VM_INSTANCE_LEAKS;
    public static int DETECT_VM_NON_SDK_API_USAGE;
    public static int DETECT_VM_REGISTRATION_LEAKS;
    public static int DETECT_VM_UNTAGGED_SOCKET;
    public static java.lang.String DISABLE_PROPERTY;
    public static int NETWORK_POLICY_ACCEPT;
    public static int NETWORK_POLICY_LOG;
    public static int NETWORK_POLICY_REJECT;
    public static int PENALTY_DEATH;
    public static int PENALTY_DEATH_ON_CLEARTEXT_NETWORK;
    public static int PENALTY_DEATH_ON_FILE_URI_EXPOSURE;
    public static int PENALTY_DEATH_ON_NETWORK;
    public static int PENALTY_DIALOG;
    public static int PENALTY_DROPBOX;
    public static int PENALTY_FLASH;
    public static int PENALTY_GATHER;
    public static int PENALTY_LOG;
    public static java.lang.String VISUAL_PROPERTY;
}

-keep class android.os.StrictMode$Span {
    <init>();

    public void finish();


}

-keep class android.os.StrictMode$ThreadPolicy {

    public java.lang.String toString();


    public static android.os.StrictMode$ThreadPolicy LAX;
}

-keep class android.os.StrictMode$ViolationInfo {
    <init>(android.os.Parcel);
    <init>(android.os.Parcel, boolean);

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public int getPolicyMask();
    public java.lang.String getStackTrace();
    public int getViolationBit();
    public java.lang.String getViolationDetails();
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String broadcastIntentAction;
    public int durationMillis;
    public int numAnimationsRunning;
    public long numInstances;
    public java.lang.String[] tags;
    public int violationNumThisLoop;
    public long violationUptimeMillis;
}

-keep class android.os.StrictMode$ViolationLogger {

    public abstract void log(android.os.StrictMode$ViolationInfo);


}

-keep class android.os.StrictMode$VmPolicy {

    public java.lang.String toString();


    public static android.os.StrictMode$VmPolicy LAX;
}

-keep class android.os.TestLooperManager {
    <init>(android.os.Looper);

    public void execute(android.os.Message);
    public android.os.MessageQueue getMessageQueue();
    public android.os.MessageQueue getQueue();
    public boolean hasMessages(android.os.Handler, java.lang.Object, int);
    public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
    public android.os.Message next();
    public void recycle(android.os.Message);
    public void release();


}

-keep class android.os.TransactionTracker {

    public void addTrace(java.lang.Throwable);
    public void clearTraces();
    public void writeTracesToFile(android.os.ParcelFileDescriptor);


}

-keep class android.os.UserHandle {
    <init>(int);
    <init>(android.os.Parcel);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static void formatUid(java.lang.StringBuilder, int);
    public static java.lang.String formatUid(int);
    public static void formatUid(java.io.PrintWriter, int);
    public static int getAppId(int);
    public static int getAppIdFromSharedAppGid(int);
    public static int getCacheAppGid(int);
    public static int getCacheAppGid(int, int);
    public static int getCallingAppId();
    public static int getCallingUserId();
    public int getIdentifier();
    public static int getSharedAppGid(int);
    public static int getSharedAppGid(int, int);
    public static int getUid(int, int);
    public static int getUserGid(int);
    public static android.os.UserHandle getUserHandleForUid(int);
    public static int getUserId(int);
    public int hashCode();
    public static boolean isApp(int);
    public static boolean isCore(int);
    public static boolean isIsolated(int);
    public boolean isOwner();
    public static boolean isSameApp(int, int);
    public static boolean isSameUser(int, int);
    public boolean isSystem();
    public static int myUserId();
    public static android.os.UserHandle of(int);
    public static int parseUserArg(java.lang.String);
    public static android.os.UserHandle readFromParcel(android.os.Parcel);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public static void writeToParcel(android.os.UserHandle, android.os.Parcel);


    public static int AID_APP_END;
    public static int AID_APP_START;
    public static int AID_CACHE_GID_START;
    public static int AID_ROOT;
    public static int AID_SHARED_GID_START;
    public static android.os.UserHandle ALL;
    public static android.os.Parcelable$Creator CREATOR;
    public static android.os.UserHandle CURRENT;
    public static android.os.UserHandle CURRENT_OR_SELF;
    public static int ERR_GID;
    public static boolean MU_ENABLED;
    public static android.os.UserHandle OWNER;
    public static int PER_USER_RANGE;
    public static android.os.UserHandle SYSTEM;
    public static int USER_ALL;
    public static int USER_CURRENT;
    public static int USER_CURRENT_OR_SELF;
    public static int USER_NULL;
    public static int USER_OWNER;
    public static int USER_SERIAL_SYSTEM;
    public static int USER_SYSTEM;
}

-keep class android.os.VibrationEffect {
    <init>();

    public static android.os.VibrationEffect createOneShot(long, int);
    public static android.os.VibrationEffect createWaveform(long[], int);
    public static android.os.VibrationEffect createWaveform(long[], int[], int);
    public int describeContents();
    public static android.os.VibrationEffect get(int);
    public static android.os.VibrationEffect get(int, boolean);
    public static android.os.VibrationEffect get(android.net.Uri, android.content.Context);
    public abstract long getDuration();
    protected static int scale(int, float, int);
    public abstract void validate();


    public static android.os.Parcelable$Creator CREATOR;
    public static int DEFAULT_AMPLITUDE;
    public static int EFFECT_CLICK;
    public static int EFFECT_DOUBLE_CLICK;
    public static int EFFECT_HEAVY_CLICK;
    public static int EFFECT_POP;
    public static int EFFECT_THUD;
    public static int EFFECT_TICK;
    public static int MAX_AMPLITUDE;
    public static int[] RINGTONES;
}

-keep class android.os.Vibrator {
    <init>();
    <init>(android.content.Context);

    public abstract void cancel();
    public int getDefaultHapticFeedbackIntensity();
    public int getDefaultNotificationVibrationIntensity();
    public abstract boolean hasAmplitudeControl();
    public abstract boolean hasVibrator();
    public void vibrate(long);
    public void vibrate(long, android.media.AudioAttributes);
    public void vibrate(long[], int);
    public void vibrate(long[], int, android.media.AudioAttributes);
    public void vibrate(android.os.VibrationEffect);
    public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
    public abstract void vibrate(int, java.lang.String, android.os.VibrationEffect, android.media.AudioAttributes);


    public static int VIBRATION_INTENSITY_HIGH;
    public static int VIBRATION_INTENSITY_LOW;
    public static int VIBRATION_INTENSITY_MEDIUM;
    public static int VIBRATION_INTENSITY_OFF;
}

-keep class android.os.WorkSource {
    <init>();
    <init>(android.os.WorkSource);
    <init>(int);
    <init>(int, java.lang.String);

    public boolean add(android.os.WorkSource);
    public boolean add(int);
    public boolean add(int, java.lang.String);
    public android.os.WorkSource addReturningNewbs(android.os.WorkSource);
    public void clear();
    public void clearNames();
    public android.os.WorkSource$WorkChain createWorkChain();
    public int describeContents();
    public boolean diff(android.os.WorkSource);
    public static java.util.ArrayList[] diffChains(android.os.WorkSource, android.os.WorkSource);
    public boolean equals(java.lang.Object);
    public int get(int);
    public java.lang.String getName(int);
    public java.util.ArrayList getWorkChains();
    public int hashCode();
    public static boolean isChainedBatteryAttributionEnabled(android.content.Context);
    public boolean isEmpty();
    public boolean remove(android.os.WorkSource);
    public void set(android.os.WorkSource);
    public void set(int);
    public void set(int, java.lang.String);
    public android.os.WorkSource[] setReturningDiffs(android.os.WorkSource);
    public int size();
    public java.lang.String toString();
    public void transferWorkChains(android.os.WorkSource);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.WorkSource$WorkChain {
    <init>();
    <init>(android.os.WorkSource$WorkChain);

    public android.os.WorkSource$WorkChain addNode(int, java.lang.String);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public java.lang.String getAttributionTag();
    public int getAttributionUid();
    public int getSize();
    public java.lang.String[] getTags();
    public int[] getUids();
    public int hashCode();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.os.storage.DiskInfo {
    <init>(java.lang.String, int);
    <init>(android.os.Parcel);

    public android.os.storage.DiskInfo clone();
    public java.lang.Object clone();
    public int describeContents();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public boolean equals(java.lang.Object);
    public java.lang.String getDescription();
    public java.lang.String getId();
    public java.lang.String getShortDescription();
    public int hashCode();
    public boolean isAdoptable();
    public boolean isDefaultPrimary();
    public boolean isSd();
    public boolean isUsb();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ACTION_DISK_SCANNED;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_DISK_ID;
    public static java.lang.String EXTRA_VOLUME_COUNT;
    public static int FLAG_ADOPTABLE;
    public static int FLAG_DEFAULT_PRIMARY;
    public static int FLAG_SD;
    public static int FLAG_USB;
    public int flags;
    public java.lang.String id;
    public java.lang.String label;
    public long size;
    public java.lang.String sysPath;
    public int volumeCount;
}

-keep class android.os.storage.StorageVolume {
    <init>(java.lang.String, java.io.File, java.io.File, java.lang.String, boolean, boolean, boolean, boolean, long, android.os.UserHandle, java.lang.String, java.lang.String);

    public boolean allowMassStorage();
    public android.content.Intent createAccessIntent(java.lang.String);
    public int describeContents();
    public java.lang.String dump();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public boolean equals(java.lang.Object);
    public java.lang.String getDescription(android.content.Context);
    public int getFatVolumeId();
    public java.lang.String getId();
    public java.lang.String getInternalPath();
    public long getMaxFileSize();
    public android.os.UserHandle getOwner();
    public java.lang.String getPath();
    public java.io.File getPathFile();
    public java.lang.String getState();
    public java.lang.String getUserLabel();
    public java.lang.String getUuid();
    public int hashCode();
    public boolean isEmulated();
    public boolean isPrimary();
    public boolean isRemovable();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_DIRECTORY_NAME;
    public static java.lang.String EXTRA_STORAGE_VOLUME;
    public static int STORAGE_ID_INVALID;
    public static int STORAGE_ID_PRIMARY;
}

-keep class android.os.storage.VolumeInfo {
    <init>(java.lang.String, int, android.os.storage.DiskInfo, java.lang.String);
    <init>(android.os.Parcel);

    public android.content.Intent buildBrowseIntent();
    public android.content.Intent buildBrowseIntentForUser(int);
    public static int buildStableMtpStorageId(java.lang.String);
    public android.os.storage.StorageVolume buildStorageVolume(android.content.Context, int, boolean);
    public android.os.storage.VolumeInfo clone();
    public java.lang.Object clone();
    public int describeContents();
    public void dump(com.android.internal.util.IndentingPrintWriter);
    public boolean equals(java.lang.Object);
    public static java.lang.String getBroadcastForEnvironment(java.lang.String);
    public static java.lang.String getBroadcastForState(int);
    public java.lang.String getDescription();
    public static java.util.Comparator getDescriptionComparator();
    public android.os.storage.DiskInfo getDisk();
    public java.lang.String getDiskId();
    public static java.lang.String getEnvironmentForState(int);
    public java.lang.String getFsUuid();
    public java.lang.String getId();
    public java.io.File getInternalPath();
    public java.io.File getInternalPathForUser(int);
    public int getMountUserId();
    public java.io.File getPath();
    public java.io.File getPathForUser(int);
    public int getState();
    public int getStateDescription();
    public int getType();
    public int hashCode();
    public boolean isMountedReadable();
    public boolean isMountedWritable();
    public boolean isPrimary();
    public boolean isPrimaryPhysical();
    public boolean isVisible();
    public boolean isVisibleForRead(int);
    public boolean isVisibleForUser(int);
    public boolean isVisibleForWrite(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static java.lang.String ACTION_VOLUME_STATE_CHANGED;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_VOLUME_ID;
    public static java.lang.String EXTRA_VOLUME_STATE;
    public static java.lang.String ID_EMULATED_INTERNAL;
    public static java.lang.String ID_PRIVATE_INTERNAL;
    public static int MOUNT_FLAG_PRIMARY;
    public static int MOUNT_FLAG_VISIBLE;
    public static int STATE_BAD_REMOVAL;
    public static int STATE_CHECKING;
    public static int STATE_EJECTING;
    public static int STATE_FORMATTING;
    public static int STATE_MOUNTED;
    public static int STATE_MOUNTED_READ_ONLY;
    public static int STATE_REMOVED;
    public static int STATE_UNMOUNTABLE;
    public static int STATE_UNMOUNTED;
    public static int TYPE_ASEC;
    public static int TYPE_EMULATED;
    public static int TYPE_OBB;
    public static int TYPE_PRIVATE;
    public static int TYPE_PUBLIC;
    public android.os.storage.DiskInfo disk;
    public java.lang.String fsLabel;
    public java.lang.String fsType;
    public java.lang.String fsUuid;
    public java.lang.String id;
    public java.lang.String internalPath;
    public int mountFlags;
    public int mountUserId;
    public java.lang.String partGuid;
    public java.lang.String path;
    public int state;
    public int type;
}

-keep class android.os.strictmode.Violation {



}

-keep class android.service.autofill.FieldClassification {
    <init>(java.util.ArrayList);

    public java.util.List getMatches();
    public java.lang.String toString();


}

-keep class android.service.autofill.FieldClassification$Match {
    <init>(java.lang.String, float);

    public java.lang.String getCategoryId();
    public float getScore();
    public java.lang.String toString();


}

-keep class android.service.autofill.FillEventHistory {
    <init>(int, android.os.Bundle);

    public void addEvent(android.service.autofill.FillEventHistory$Event);
    public int describeContents();
    public android.os.Bundle getClientState();
    public java.util.List getEvents();
    public int getSessionId();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.service.autofill.FillEventHistory$Event {
    <init>(int, java.lang.String, android.os.Bundle, java.util.List, android.util.ArraySet, java.util.ArrayList, java.util.ArrayList, java.util.ArrayList, java.util.ArrayList, android.view.autofill.AutofillId[], android.service.autofill.FieldClassification[]);

    public java.util.Map getChangedFields();
    public android.os.Bundle getClientState();
    public java.lang.String getDatasetId();
    public java.util.Map getFieldsClassification();
    public java.util.Set getIgnoredDatasetIds();
    public java.util.Map getManuallyEnteredField();
    public java.util.Set getSelectedDatasetIds();
    public int getType();
    public java.lang.String toString();


    public static int TYPE_AUTHENTICATION_SELECTED;
    public static int TYPE_CONTEXT_COMMITTED;
    public static int TYPE_DATASET_AUTHENTICATION_SELECTED;
    public static int TYPE_DATASET_SELECTED;
    public static int TYPE_SAVE_SHOWN;
}

-keep class android.service.autofill.UserData {

    public int describeContents();
    public void dump(java.lang.String, java.io.PrintWriter);
    public static void dumpConstraints(java.lang.String, java.io.PrintWriter);
    public android.os.Bundle getAlgorithmArgs();
    public java.lang.String[] getCategoryIds();
    public java.lang.String getFieldClassificationAlgorithm();
    public java.lang.String getId();
    public static int getMaxCategoryCount();
    public static int getMaxFieldClassificationIdsSize();
    public static int getMaxUserDataSize();
    public static int getMaxValueLength();
    public static int getMinValueLength();
    public java.lang.String[] getValues();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.service.voice.IVoiceInteractionSession {

    public abstract void closeSystemDialogs();
    public abstract void destroy();
    public abstract void handleAssist(android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, int, int);
    public abstract void handleScreenshot(android.graphics.Bitmap);
    public abstract void hide();
    public abstract void onLockscreenShown();
    public abstract void show(android.os.Bundle, int, com.android.internal.app.IVoiceInteractionSessionShowCallback);
    public abstract void taskFinished(android.content.Intent, int);
    public abstract void taskStarted(android.content.Intent, int);


}

-keep class android.support.car.Car {

    public void connect();
    public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback, android.os.Handler);
    public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback);
    public void disconnect();
    public java.lang.Object getCarManager(java.lang.String);
    public java.lang.Object getCarManager(java.lang.Class);
    public boolean isConnected();
    public boolean isConnecting();


    public static java.lang.String APP_FOCUS_SERVICE;
    public static java.lang.String AUDIO_SERVICE;
    public static java.lang.String INFO_SERVICE;
    public static java.lang.String NAVIGATION_STATUS_SERVICE;
    public static java.lang.String PERMISSION_CAR_NAVIGATION_MANAGER;
    public static java.lang.String PERMISSION_VENDOR_EXTENSION;
    public static java.lang.String SENSOR_SERVICE;
}

-keep class android.support.car.CarAppFocusManager {
    <init>();

    public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback, int);
    public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
    public abstract void addFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
    public abstract boolean isOwningFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
    public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
    public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener);
    public abstract int requestAppFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);


    public static int APP_FOCUS_REQUEST_FAILED;
    public static int APP_FOCUS_REQUEST_SUCCEEDED;
    public static int APP_FOCUS_TYPE_NAVIGATION;
}

-keep class android.support.car.CarAppFocusManager$OnAppFocusChangedListener {

    public abstract void onAppFocusChanged(android.support.car.CarAppFocusManager, int, boolean);


}

-keep class android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback {

    public abstract void onAppFocusOwnershipGranted(android.support.car.CarAppFocusManager, int);
    public abstract void onAppFocusOwnershipLost(android.support.car.CarAppFocusManager, int);


}

-keep class android.support.car.CarConnectionCallback {
    <init>();

    public abstract void onConnected(android.support.car.Car);
    public abstract void onDisconnected(android.support.car.Car);


}

-keep class android.support.car.CarInfoManager {
    <init>();

    public abstract int getDriverPosition();
    public abstract float getEvBatteryCapacity();
    public abstract int[] getEvConnectorTypes();
    public abstract float getFuelCapacity();
    public abstract int[] getFuelTypes();
    public abstract java.lang.String getHeadunitManufacturer();
    public abstract java.lang.String getHeadunitModel();
    public abstract java.lang.String getHeadunitSoftwareBuild();
    public abstract java.lang.String getHeadunitSoftwareVersion();
    public abstract java.lang.String getManufacturer();
    public abstract java.lang.String getModel();
    public abstract java.lang.String getModelYear();
    public abstract java.lang.String getVehicleId();


    public static int DRIVER_SIDE_CENTER;
    public static int DRIVER_SIDE_LEFT;
    public static int DRIVER_SIDE_RIGHT;
    public static int DRIVER_SIDE_UNKNOWN;
}

-keep class android.support.car.CarNotConnectedException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Exception);



}

-keep class android.support.car.annotation.ValueTypeDef {



}

-keep class android.support.car.annotation.VersionDef {



}

-keep class android.support.car.hardware.CarSensorEvent {

    public android.support.car.hardware.CarSensorEvent$CompassData getCompassData();
    public android.support.car.hardware.CarSensorEvent$DrivingStatusData getDrivingStatusData();
    public android.support.car.hardware.CarSensorEvent$NightData getNightData();
    public android.support.car.hardware.CarSensorEvent$ParkingBrakeData getParkingBrakeData();


    public static int DRIVE_STATUS_FULLY_RESTRICTED;
    public static int DRIVE_STATUS_LIMIT_MESSAGE_LEN;
    public static int DRIVE_STATUS_NO_CONFIG;
    public static int DRIVE_STATUS_NO_KEYBOARD_INPUT;
    public static int DRIVE_STATUS_NO_VIDEO;
    public static int DRIVE_STATUS_NO_VOICE_INPUT;
    public static int DRIVE_STATUS_UNRESTRICTED;
    public static int INDEX_COMPASS_BEARING;
    public static int INDEX_COMPASS_PITCH;
    public static int INDEX_COMPASS_ROLL;
    public static int INDEX_WHEEL_DISTANCE_FRONT_LEFT;
    public static int INDEX_WHEEL_DISTANCE_FRONT_RIGHT;
    public static int INDEX_WHEEL_DISTANCE_REAR_LEFT;
    public static int INDEX_WHEEL_DISTANCE_REAR_RIGHT;
    public static int INDEX_WHEEL_DISTANCE_RESET_COUNT;
    public float[] floatValues;
    public int[] intValues;
    public long[] longValues;
    public int sensorType;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$CompassData {



    public float bearing;
    public float pitch;
    public float roll;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$DrivingStatusData {

    public boolean isConfigurationRestricted();
    public boolean isFullyRestricted();
    public boolean isKeyboardRestricted();
    public boolean isMessageLengthRestricted();
    public boolean isVideoRestricted();
    public boolean isVoiceRestricted();


    public int status;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$NightData {



    public boolean isNightMode;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorEvent$ParkingBrakeData {



    public boolean isEngaged;
    public long timestamp;
}

-keep class android.support.car.hardware.CarSensorManager {
    <init>();

    public abstract boolean addListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int, int);
    public abstract android.support.car.hardware.CarSensorEvent getLatestSensorEvent(int);
    public abstract int[] getSupportedSensors();
    public abstract boolean isSensorSupported(int);
    public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener);
    public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int);


    public static int SENSOR_RATE_FASTEST;
    public static int SENSOR_RATE_NORMAL;
    public static int SENSOR_TYPE_ABS_ACTIVE;
    public static int SENSOR_TYPE_COMPASS;
    public static int SENSOR_TYPE_DRIVING_STATUS;
    public static int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE;
    public static int SENSOR_TYPE_EV_BATTERY_LEVEL;
    public static int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED;
    public static int SENSOR_TYPE_EV_CHARGE_PORT_OPEN;
    public static int SENSOR_TYPE_FUEL_DOOR_OPEN;
    public static int SENSOR_TYPE_NIGHT;
    public static int SENSOR_TYPE_PARKING_BRAKE;
    public static int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE;
    public static int SENSOR_TYPE_WHEEL_TICK_DISTANCE;
}

-keep class android.support.car.hardware.CarSensorManager$OnSensorChangedListener {

    public abstract void onSensorChanged(android.support.car.hardware.CarSensorManager, android.support.car.hardware.CarSensorEvent);


}

-keep class android.support.car.media.CarAudioManager {
    <init>();

    public abstract android.support.car.media.CarAudioRecord createCarAudioRecord(int);
    public abstract android.media.AudioFormat getAudioRecordAudioFormat();
    public abstract int getAudioRecordMaxBufferSize();
    public abstract int getAudioRecordMinBufferSize();
    public abstract boolean isAudioRecordSupported();


}

-keep class android.support.car.media.CarAudioRecord {
    <init>();

    public abstract int getAudioSessionId();
    public abstract int getBufferSize();
    public abstract int getRecordingState();
    public abstract int getState();
    public abstract int read(byte[], int, int);
    public abstract void release();
    public abstract void startRecording();
    public abstract void stop();


}

-keep class android.support.car.navigation.CarNavigationInstrumentCluster {

    public int getImageColorDepthBits();
    public int getImageHeight();
    public int getImageWidth();
    public int getMinIntervalMillis();
    public int getType();
    public boolean supportsCustomImages();
    public java.lang.String toString();


    public static int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED;
    public static int CLUSTER_TYPE_IMAGE_CODES_ONLY;
}

-keep class android.support.car.navigation.CarNavigationStatusManager {
    <init>();

    public abstract void addListener(android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback);
    public abstract void removeListener();
    public abstract void sendEvent(int, android.os.Bundle);


}

-keep class android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback {

    public abstract void onInstrumentClusterStarted(android.support.car.navigation.CarNavigationStatusManager, android.support.car.navigation.CarNavigationInstrumentCluster);
    public abstract void onInstrumentClusterStopped(android.support.car.navigation.CarNavigationStatusManager);


}

-keep class android.transition.PathMotion {
    <init>();
    <init>(android.content.Context, android.util.AttributeSet);

    public abstract android.graphics.Path getPath(float, float, float, float);


}

-keep class android.transition.Scene {
    <init>(android.view.ViewGroup);
    <init>(android.view.ViewGroup, android.view.View);
    <init>(android.view.ViewGroup, android.view.ViewGroup);

    public void enter();
    public void exit();
    public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
    public android.view.ViewGroup getSceneRoot();
    public void setEnterAction(java.lang.Runnable);
    public void setExitAction(java.lang.Runnable);


}

-keep class android.transition.Transition {
    <init>();
    <init>(android.content.Context, android.util.AttributeSet);

    public android.transition.Transition addListener(android.transition.Transition$TransitionListener);
    public android.transition.Transition addTarget(int);
    public android.transition.Transition addTarget(java.lang.String);
    public android.transition.Transition addTarget(java.lang.Class);
    public android.transition.Transition addTarget(android.view.View);
    protected void animate(android.animation.Animator);
    public boolean canRemoveViews();
    protected void cancel();
    public abstract void captureEndValues(android.transition.TransitionValues);
    public abstract void captureStartValues(android.transition.TransitionValues);
    public android.transition.Transition clone();
    public java.lang.Object clone();
    public android.animation.Animator createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues);
    protected void createAnimators(android.view.ViewGroup, android.transition.TransitionValuesMaps, android.transition.TransitionValuesMaps, java.util.ArrayList, java.util.ArrayList);
    protected void end();
    public android.transition.Transition excludeChildren(int, boolean);
    public android.transition.Transition excludeChildren(android.view.View, boolean);
    public android.transition.Transition excludeChildren(java.lang.Class, boolean);
    public android.transition.Transition excludeTarget(int, boolean);
    public android.transition.Transition excludeTarget(java.lang.String, boolean);
    public android.transition.Transition excludeTarget(android.view.View, boolean);
    public android.transition.Transition excludeTarget(java.lang.Class, boolean);
    public long getDuration();
    public android.graphics.Rect getEpicenter();
    public android.transition.Transition$EpicenterCallback getEpicenterCallback();
    public android.animation.TimeInterpolator getInterpolator();
    public java.lang.String getName();
    public android.util.ArrayMap getNameOverrides();
    public android.transition.PathMotion getPathMotion();
    public android.transition.TransitionPropagation getPropagation();
    public long getStartDelay();
    public java.util.List getTargetIds();
    public java.util.List getTargetNames();
    public java.util.List getTargetTypes();
    public java.util.List getTargetViewNames();
    public java.util.List getTargets();
    public java.lang.String[] getTransitionProperties();
    public android.transition.TransitionValues getTransitionValues(android.view.View, boolean);
    public boolean isTransitionRequired(android.transition.TransitionValues, android.transition.TransitionValues);
    public boolean isValidTarget(android.view.View);
    public void pause(android.view.View);
    public android.transition.Transition removeListener(android.transition.Transition$TransitionListener);
    public android.transition.Transition removeTarget(int);
    public android.transition.Transition removeTarget(java.lang.String);
    public android.transition.Transition removeTarget(android.view.View);
    public android.transition.Transition removeTarget(java.lang.Class);
    public void resume(android.view.View);
    protected void runAnimators();
    public android.transition.Transition setDuration(long);
    public void setEpicenterCallback(android.transition.Transition$EpicenterCallback);
    public android.transition.Transition setInterpolator(android.animation.TimeInterpolator);
    public void setMatchOrder(int[]);
    public void setNameOverrides(android.util.ArrayMap);
    public void setPathMotion(android.transition.PathMotion);
    public void setPropagation(android.transition.TransitionPropagation);
    public android.transition.Transition setStartDelay(long);
    protected void start();
    public java.lang.String toString();


    public static int MATCH_ID;
    public static int MATCH_INSTANCE;
    public static int MATCH_ITEM_ID;
    public static int MATCH_NAME;
}

-keep class android.transition.Transition$EpicenterCallback {
    <init>();

    public abstract android.graphics.Rect onGetEpicenter(android.transition.Transition);


}

-keep class android.transition.Transition$TransitionListener {

    public abstract void onTransitionCancel(android.transition.Transition);
    public abstract void onTransitionEnd(android.transition.Transition);
    public abstract void onTransitionPause(android.transition.Transition);
    public abstract void onTransitionResume(android.transition.Transition);
    public abstract void onTransitionStart(android.transition.Transition);


}

-keep class android.transition.TransitionManager {
    <init>();

    public static void beginDelayedTransition(android.view.ViewGroup);
    public static void beginDelayedTransition(android.view.ViewGroup, android.transition.Transition);
    public static void endTransitions(android.view.ViewGroup);
    public static android.transition.Transition getDefaultTransition();
    public android.transition.Transition getTransition(android.transition.Scene);
    public static void go(android.transition.Scene);
    public static void go(android.transition.Scene, android.transition.Transition);
    public void setDefaultTransition(android.transition.Transition);
    public void setTransition(android.transition.Scene, android.transition.Transition);
    public void setTransition(android.transition.Scene, android.transition.Scene, android.transition.Transition);
    public void transitionTo(android.transition.Scene);


}

-keep class android.transition.TransitionPropagation {
    <init>();

    public abstract void captureValues(android.transition.TransitionValues);
    public abstract java.lang.String[] getPropagationProperties();
    public abstract long getStartDelay(android.view.ViewGroup, android.transition.Transition, android.transition.TransitionValues, android.transition.TransitionValues);


}

-keep class android.transition.TransitionValues {
    <init>();

    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();


    public java.util.Map values;
    public android.view.View view;
}

-keep class android.transition.TransitionValuesMaps {



}

-keep class android.util.AndroidException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Exception);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-keep class android.util.ArrayMap {
    <init>();
    <init>(int);
    <init>(int, boolean);
    <init>(android.util.ArrayMap);

    public void append(java.lang.Object, java.lang.Object);
    public void clear();
    public boolean containsAll(java.util.Collection);
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public void ensureCapacity(int);
    public java.util.Set entrySet();
    public boolean equals(java.lang.Object);
    public void erase();
    public java.lang.Object get(java.lang.Object);
    public int hashCode();
    public int indexOfKey(java.lang.Object);
    public boolean isEmpty();
    public java.lang.Object keyAt(int);
    public java.util.Set keySet();
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(android.util.ArrayMap);
    public void putAll(java.util.Map);
    public java.lang.Object remove(java.lang.Object);
    public boolean removeAll(java.util.Collection);
    public java.lang.Object removeAt(int);
    public boolean retainAll(java.util.Collection);
    public java.lang.Object setValueAt(int, java.lang.Object);
    public int size();
    public java.lang.String toString();
    public void validate();
    public java.lang.Object valueAt(int);
    public java.util.Collection values();


    public static android.util.ArrayMap EMPTY;
}

-keep class android.util.ArraySet {
    <init>();
    <init>(int);
    <init>(int, boolean);
    <init>(android.util.ArraySet);
    <init>(java.util.Collection);

    public boolean add(java.lang.Object);
    public void addAll(android.util.ArraySet);
    public boolean addAll(java.util.Collection);
    public void append(java.lang.Object);
    public void clear();
    public boolean contains(java.lang.Object);
    public boolean containsAll(java.util.Collection);
    public void ensureCapacity(int);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public int indexOf(java.lang.Object);
    public boolean isEmpty();
    public java.util.Iterator iterator();
    public boolean remove(java.lang.Object);
    public boolean removeAll(android.util.ArraySet);
    public boolean removeAll(java.util.Collection);
    public java.lang.Object removeAt(int);
    public boolean retainAll(java.util.Collection);
    public int size();
    public java.lang.Object[] toArray();
    public java.lang.Object[] toArray(java.lang.Object[]);
    public java.lang.String toString();
    public java.lang.Object valueAt(int);


}

-keep class android.util.AttributeSet {

    public abstract boolean getAttributeBooleanValue(java.lang.String, java.lang.String, boolean);
    public abstract boolean getAttributeBooleanValue(int, boolean);
    public abstract int getAttributeCount();
    public abstract float getAttributeFloatValue(java.lang.String, java.lang.String, float);
    public abstract float getAttributeFloatValue(int, float);
    public abstract int getAttributeIntValue(java.lang.String, java.lang.String, int);
    public abstract int getAttributeIntValue(int, int);
    public abstract int getAttributeListValue(java.lang.String, java.lang.String, java.lang.String[], int);
    public abstract int getAttributeListValue(int, java.lang.String[], int);
    public abstract java.lang.String getAttributeName(int);
    public abstract int getAttributeNameResource(int);
    public java.lang.String getAttributeNamespace(int);
    public abstract int getAttributeResourceValue(java.lang.String, java.lang.String, int);
    public abstract int getAttributeResourceValue(int, int);
    public abstract int getAttributeUnsignedIntValue(java.lang.String, java.lang.String, int);
    public abstract int getAttributeUnsignedIntValue(int, int);
    public abstract java.lang.String getAttributeValue(int);
    public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
    public abstract java.lang.String getClassAttribute();
    public abstract java.lang.String getIdAttribute();
    public abstract int getIdAttributeResourceValue(int);
    public abstract java.lang.String getPositionDescription();
    public abstract int getStyleAttribute();


}

-keep class android.util.DisplayMetrics {
    <init>();

    public boolean equals(java.lang.Object);
    public boolean equals(android.util.DisplayMetrics);
    public boolean equalsPhysical(android.util.DisplayMetrics);
    public int hashCode();
    public void setTo(android.util.DisplayMetrics);
    public void setToDefaults();
    public java.lang.String toString();


    public static int DENSITY_260;
    public static int DENSITY_280;
    public static int DENSITY_300;
    public static int DENSITY_340;
    public static int DENSITY_360;
    public static int DENSITY_400;
    public static int DENSITY_420;
    public static int DENSITY_440;
    public static int DENSITY_560;
    public static int DENSITY_DEFAULT;
    public static float DENSITY_DEFAULT_SCALE;
    public static int DENSITY_DEVICE;
    public static int DENSITY_DEVICE_STABLE;
    public static int DENSITY_HIGH;
    public static int DENSITY_LOW;
    public static int DENSITY_MEDIUM;
    public static int DENSITY_TV;
    public static int DENSITY_XHIGH;
    public static int DENSITY_XXHIGH;
    public static int DENSITY_XXXHIGH;
    public float density;
    public int densityDpi;
    public int heightPixels;
    public float noncompatDensity;
    public int noncompatDensityDpi;
    public int noncompatHeightPixels;
    public float noncompatScaledDensity;
    public int noncompatWidthPixels;
    public float noncompatXdpi;
    public float noncompatYdpi;
    public float scaledDensity;
    public int widthPixels;
    public float xdpi;
    public float ydpi;
}

-keep class android.util.LongArray {
    <init>();
    <init>(int);

    public void add(long);
    public void add(int, long);
    public void addAll(android.util.LongArray);
    public void clear();
    public android.util.LongArray clone();
    public java.lang.Object clone();
    public static boolean elementsEqual(android.util.LongArray, android.util.LongArray);
    public static android.util.LongArray fromArray(long[], int);
    public long get(int);
    public int indexOf(long);
    public void remove(int);
    public void resize(int);
    public void set(int, long);
    public int size();
    public long[] toArray();
    public static android.util.LongArray wrap(long[]);


}

-keep class android.util.LongSparseArray {
    <init>();
    <init>(int);

    public void append(long, java.lang.Object);
    public void clear();
    public android.util.LongSparseArray clone();
    public java.lang.Object clone();
    public void delete(long);
    public java.lang.Object get(long);
    public java.lang.Object get(long, java.lang.Object);
    public int indexOfKey(long);
    public int indexOfValue(java.lang.Object);
    public int indexOfValueByValue(java.lang.Object);
    public long keyAt(int);
    public void put(long, java.lang.Object);
    public void remove(long);
    public void removeAt(int);
    public void setValueAt(int, java.lang.Object);
    public int size();
    public java.lang.String toString();
    public java.lang.Object valueAt(int);


}

-keep class android.util.MergedConfiguration {
    <init>();
    <init>(android.content.res.Configuration, android.content.res.Configuration);
    <init>(android.content.res.Configuration);
    <init>(android.util.MergedConfiguration);

    public int describeContents();
    public void dump(java.io.PrintWriter, java.lang.String);
    public boolean equals(java.lang.Object);
    public android.content.res.Configuration getGlobalConfiguration();
    public android.content.res.Configuration getMergedConfiguration();
    public android.content.res.Configuration getOverrideConfiguration();
    public int hashCode();
    public void readFromParcel(android.os.Parcel);
    public void setConfiguration(android.content.res.Configuration, android.content.res.Configuration);
    public void setGlobalConfiguration(android.content.res.Configuration);
    public void setOverrideConfiguration(android.content.res.Configuration);
    public void setTo(android.util.MergedConfiguration);
    public java.lang.String toString();
    public void unset();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.util.Pair {
    <init>(java.lang.Object, java.lang.Object);

    public static android.util.Pair create(java.lang.Object, java.lang.Object);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();


    public java.lang.Object first;
    public java.lang.Object second;
}

-keep class android.util.Printer {

    public abstract void println(java.lang.String);


}

-keep class android.util.Property {
    <init>(java.lang.Class, java.lang.String);

    public abstract java.lang.Object get(java.lang.Object);
    public java.lang.String getName();
    public java.lang.Class getType();
    public boolean isReadOnly();
    public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String);
    public void set(java.lang.Object, java.lang.Object);


}

-keep class android.util.Rational {
    <init>(int, int);

    public int compareTo(android.util.Rational);
    public int compareTo(java.lang.Object);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public static int gcd(int, int);
    public int getDenominator();
    public int getNumerator();
    public int hashCode();
    public int intValue();
    public boolean isFinite();
    public boolean isInfinite();
    public boolean isNaN();
    public boolean isZero();
    public long longValue();
    public static android.util.Rational parseRational(java.lang.String);
    public short shortValue();
    public float toFloat();
    public java.lang.String toString();


    public static android.util.Rational NEGATIVE_INFINITY;
    public static android.util.Rational NaN;
    public static android.util.Rational POSITIVE_INFINITY;
    public static android.util.Rational ZERO;
}

-keep class android.util.Size {
    <init>(int, int);

    public boolean equals(java.lang.Object);
    public int getHeight();
    public int getWidth();
    public int hashCode();
    public static android.util.Size parseSize(java.lang.String);
    public java.lang.String toString();


}

-keep class android.util.SizeF {
    <init>(float, float);

    public boolean equals(java.lang.Object);
    public float getHeight();
    public float getWidth();
    public int hashCode();
    public static android.util.SizeF parseSizeF(java.lang.String);
    public java.lang.String toString();


}

-keep class android.util.SparseArray {
    <init>();
    <init>(int);

    public void append(int, java.lang.Object);
    public void clear();
    public android.util.SparseArray clone();
    public java.lang.Object clone();
    public void delete(int);
    public java.lang.Object get(int);
    public java.lang.Object get(int, java.lang.Object);
    public int indexOfKey(int);
    public int indexOfValue(java.lang.Object);
    public int indexOfValueByValue(java.lang.Object);
    public int keyAt(int);
    public void put(int, java.lang.Object);
    public void remove(int);
    public void removeAt(int);
    public void removeAtRange(int, int);
    public java.lang.Object removeReturnOld(int);
    public void setValueAt(int, java.lang.Object);
    public int size();
    public java.lang.String toString();
    public java.lang.Object valueAt(int);


}

-keep class android.util.SparseBooleanArray {
    <init>();
    <init>(int);

    public void append(int, boolean);
    public void clear();
    public android.util.SparseBooleanArray clone();
    public java.lang.Object clone();
    public void delete(int);
    public boolean equals(java.lang.Object);
    public boolean get(int);
    public boolean get(int, boolean);
    public int hashCode();
    public int indexOfKey(int);
    public int indexOfValue(boolean);
    public int keyAt(int);
    public void put(int, boolean);
    public void removeAt(int);
    public void setKeyAt(int, int);
    public void setValueAt(int, boolean);
    public int size();
    public java.lang.String toString();
    public boolean valueAt(int);


}

-keep class android.util.SparseIntArray {
    <init>();
    <init>(int);

    public void append(int, int);
    public void clear();
    public android.util.SparseIntArray clone();
    public java.lang.Object clone();
    public int[] copyKeys();
    public void delete(int);
    public int get(int);
    public int get(int, int);
    public int indexOfKey(int);
    public int indexOfValue(int);
    public int keyAt(int);
    public void put(int, int);
    public void removeAt(int);
    public void setValueAt(int, int);
    public int size();
    public java.lang.String toString();
    public int valueAt(int);


}

-keep class android.util.TypedValue {
    <init>();

    public static float applyDimension(int, float, android.util.DisplayMetrics);
    public java.lang.CharSequence coerceToString();
    public static java.lang.String coerceToString(int, int);
    public static float complexToDimension(int, android.util.DisplayMetrics);
    public static float complexToDimensionNoisy(int, android.util.DisplayMetrics);
    public static int complexToDimensionPixelOffset(int, android.util.DisplayMetrics);
    public static int complexToDimensionPixelSize(int, android.util.DisplayMetrics);
    public static float complexToFloat(int);
    public static float complexToFraction(int, float, float);
    public int getComplexUnit();
    public float getDimension(android.util.DisplayMetrics);
    public float getFloat();
    public float getFraction(float, float);
    public void setTo(android.util.TypedValue);
    public java.lang.String toString();


    public static int COMPLEX_MANTISSA_MASK;
    public static int COMPLEX_MANTISSA_SHIFT;
    public static int COMPLEX_RADIX_0p23;
    public static int COMPLEX_RADIX_16p7;
    public static int COMPLEX_RADIX_23p0;
    public static int COMPLEX_RADIX_8p15;
    public static int COMPLEX_RADIX_MASK;
    public static int COMPLEX_RADIX_SHIFT;
    public static int COMPLEX_UNIT_DIP;
    public static int COMPLEX_UNIT_FRACTION;
    public static int COMPLEX_UNIT_FRACTION_PARENT;
    public static int COMPLEX_UNIT_IN;
    public static int COMPLEX_UNIT_MASK;
    public static int COMPLEX_UNIT_MM;
    public static int COMPLEX_UNIT_PT;
    public static int COMPLEX_UNIT_PX;
    public static int COMPLEX_UNIT_SHIFT;
    public static int COMPLEX_UNIT_SP;
    public static int DATA_NULL_EMPTY;
    public static int DATA_NULL_UNDEFINED;
    public static int DENSITY_DEFAULT;
    public static int DENSITY_NONE;
    public static int TYPE_ATTRIBUTE;
    public static int TYPE_DIMENSION;
    public static int TYPE_FIRST_COLOR_INT;
    public static int TYPE_FIRST_INT;
    public static int TYPE_FLOAT;
    public static int TYPE_FRACTION;
    public static int TYPE_INT_BOOLEAN;
    public static int TYPE_INT_COLOR_ARGB4;
    public static int TYPE_INT_COLOR_ARGB8;
    public static int TYPE_INT_COLOR_RGB4;
    public static int TYPE_INT_COLOR_RGB8;
    public static int TYPE_INT_DEC;
    public static int TYPE_INT_HEX;
    public static int TYPE_LAST_COLOR_INT;
    public static int TYPE_LAST_INT;
    public static int TYPE_NULL;
    public static int TYPE_REFERENCE;
    public static int TYPE_STRING;
    public int assetCookie;
    public int changingConfigurations;
    public int data;
    public int density;
    public int resourceId;
    public java.lang.CharSequence string;
    public int type;
}

-keep class android.util.proto.ProtoOutputStream {
    <init>();
    <init>(int);
    <init>(java.io.OutputStream);
    <init>(java.io.FileDescriptor);

    public static int checkFieldId(long, long);
    public static int convertObjectIdToOrdinal(int);
    public void dump(java.lang.String);
    public void end(long);
    public void endObject(long);
    public void endRepeatedObject(long);
    public void flush();
    public byte[] getBytes();
    public static int getDepthFromToken(long);
    public static int getObjectIdFromToken(long);
    public static boolean getRepeatedFromToken(long);
    public static int getSizePosFromToken(long);
    public static int getTagSizeFromToken(long);
    public static long makeFieldId(int, long);
    public static long makeToken(int, boolean, int, int, int);
    public long start(long);
    public long startObject(long);
    public long startRepeatedObject(long);
    public static java.lang.String token2String(long);
    public void write(long, double);
    public void write(long, float);
    public void write(long, int);
    public void write(long, long);
    public void write(long, boolean);
    public void write(long, java.lang.String);
    public void write(long, byte[]);
    public void writeBool(long, boolean);
    public void writeBytes(long, byte[]);
    public void writeDouble(long, double);
    public void writeEnum(long, int);
    public void writeFixed32(long, int);
    public void writeFixed64(long, long);
    public void writeFloat(long, float);
    public void writeInt32(long, int);
    public void writeInt64(long, long);
    public void writeObject(long, byte[]);
    public void writePackedBool(long, boolean[]);
    public void writePackedDouble(long, double[]);
    public void writePackedEnum(long, int[]);
    public void writePackedFixed32(long, int[]);
    public void writePackedFixed64(long, long[]);
    public void writePackedFloat(long, float[]);
    public void writePackedInt32(long, int[]);
    public void writePackedInt64(long, long[]);
    public void writePackedSFixed32(long, int[]);
    public void writePackedSFixed64(long, long[]);
    public void writePackedSInt32(long, int[]);
    public void writePackedSInt64(long, long[]);
    public void writePackedUInt32(long, int[]);
    public void writePackedUInt64(long, long[]);
    public void writeRepeatedBool(long, boolean);
    public void writeRepeatedBytes(long, byte[]);
    public void writeRepeatedDouble(long, double);
    public void writeRepeatedEnum(long, int);
    public void writeRepeatedFixed32(long, int);
    public void writeRepeatedFixed64(long, long);
    public void writeRepeatedFloat(long, float);
    public void writeRepeatedInt32(long, int);
    public void writeRepeatedInt64(long, long);
    public void writeRepeatedObject(long, byte[]);
    public void writeRepeatedSFixed32(long, int);
    public void writeRepeatedSFixed64(long, long);
    public void writeRepeatedSInt32(long, int);
    public void writeRepeatedSInt64(long, long);
    public void writeRepeatedString(long, java.lang.String);
    public void writeRepeatedUInt32(long, int);
    public void writeRepeatedUInt64(long, long);
    public void writeSFixed32(long, int);
    public void writeSFixed64(long, long);
    public void writeSInt32(long, int);
    public void writeSInt64(long, long);
    public void writeString(long, java.lang.String);
    public void writeTag(int, int);
    public void writeUInt32(long, int);
    public void writeUInt64(long, long);


    public static long FIELD_COUNT_MASK;
    public static long FIELD_COUNT_PACKED;
    public static long FIELD_COUNT_REPEATED;
    public static int FIELD_COUNT_SHIFT;
    public static long FIELD_COUNT_SINGLE;
    public static long FIELD_COUNT_UNKNOWN;
    public static int FIELD_ID_MASK;
    public static int FIELD_ID_SHIFT;
    public static long FIELD_TYPE_BOOL;
    public static long FIELD_TYPE_BYTES;
    public static long FIELD_TYPE_DOUBLE;
    public static long FIELD_TYPE_ENUM;
    public static long FIELD_TYPE_FIXED32;
    public static long FIELD_TYPE_FIXED64;
    public static long FIELD_TYPE_FLOAT;
    public static long FIELD_TYPE_INT32;
    public static long FIELD_TYPE_INT64;
    public static long FIELD_TYPE_MASK;
    public static long FIELD_TYPE_MESSAGE;
    public static long FIELD_TYPE_SFIXED32;
    public static long FIELD_TYPE_SFIXED64;
    public static int FIELD_TYPE_SHIFT;
    public static long FIELD_TYPE_SINT32;
    public static long FIELD_TYPE_SINT64;
    public static long FIELD_TYPE_STRING;
    public static long FIELD_TYPE_UINT32;
    public static long FIELD_TYPE_UINT64;
    public static long FIELD_TYPE_UNKNOWN;
    public static java.lang.String TAG;
    public static int WIRE_TYPE_END_GROUP;
    public static int WIRE_TYPE_FIXED32;
    public static int WIRE_TYPE_FIXED64;
    public static int WIRE_TYPE_LENGTH_DELIMITED;
    public static int WIRE_TYPE_MASK;
    public static int WIRE_TYPE_START_GROUP;
    public static int WIRE_TYPE_VARINT;
}

-keep class android.view.AccessibilityInteractionController {
    <init>(android.view.ViewRootImpl);

    public void findAccessibilityNodeInfoByAccessibilityIdClientThread(long, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec, android.os.Bundle);
    public void findAccessibilityNodeInfosByTextClientThread(long, java.lang.String, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void findAccessibilityNodeInfosByViewIdClientThread(long, java.lang.String, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void findFocusClientThread(long, int, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void focusSearchClientThread(long, int, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
    public void performAccessibilityActionClientThread(long, int, android.os.Bundle, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long);


}

-keep class android.view.AccessibilityIterators {
    <init>();



}

-keep class android.view.AccessibilityIterators$TextSegmentIterator {

    public abstract int[] following(int);
    public abstract int[] preceding(int);


}

-keep class android.view.ActionMode {
    <init>();

    public abstract void finish();
    public abstract android.view.View getCustomView();
    public abstract android.view.Menu getMenu();
    public abstract android.view.MenuInflater getMenuInflater();
    public abstract java.lang.CharSequence getSubtitle();
    public java.lang.Object getTag();
    public abstract java.lang.CharSequence getTitle();
    public boolean getTitleOptionalHint();
    public int getType();
    public void hide(long);
    public abstract void invalidate();
    public void invalidateContentRect();
    public boolean isTitleOptional();
    public boolean isUiFocusable();
    public void onWindowFocusChanged(boolean);
    public abstract void setCustomView(android.view.View);
    public abstract void setSubtitle(java.lang.CharSequence);
    public abstract void setSubtitle(int);
    public void setTag(java.lang.Object);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setTitle(int);
    public void setTitleOptionalHint(boolean);
    public void setType(int);


    public static int DEFAULT_HIDE_DURATION;
    public static int TYPE_FLOATING;
    public static int TYPE_PRIMARY;
}

-keep class android.view.ActionMode$Callback {

    public abstract boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
    public abstract boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
    public abstract void onDestroyActionMode(android.view.ActionMode);
    public abstract boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);


}

-keep class android.view.ActionProvider {
    <init>(android.content.Context);

    public boolean hasSubMenu();
    public boolean isVisible();
    public abstract android.view.View onCreateActionView();
    public android.view.View onCreateActionView(android.view.MenuItem);
    public boolean onPerformDefaultAction();
    public void onPrepareSubMenu(android.view.SubMenu);
    public boolean overridesItemVisibility();
    public void refreshVisibility();
    public void reset();
    public void setSubUiVisibilityListener(android.view.ActionProvider$SubUiVisibilityListener);
    public void setVisibilityListener(android.view.ActionProvider$VisibilityListener);
    public void subUiVisibilityChanged(boolean);


}

-keep class android.view.ActionProvider$SubUiVisibilityListener {

    public abstract void onSubUiVisibilityChanged(boolean);


}

-keep class android.view.ActionProvider$VisibilityListener {

    public abstract void onActionProviderVisibilityChanged(boolean);


}

-keep class android.view.AppTransitionAnimationSpec {
    <init>(int, android.graphics.GraphicBuffer, android.graphics.Rect);
    <init>(android.os.Parcel);

    public int describeContents();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.graphics.GraphicBuffer buffer;
    public android.graphics.Rect rect;
    public int taskId;
}

-keep class android.view.Choreographer {

    public static long getFrameDelay();
    public long getFrameIntervalNanos();
    public long getFrameTime();
    public long getFrameTimeNanos();
    public static android.view.Choreographer getInstance();
    public long getLastFrameTimeNanos();
    public static android.view.Choreographer getMainThreadInstance();
    public static android.view.Choreographer getSfInstance();
    public void postCallback(int, java.lang.Runnable, java.lang.Object);
    public void postCallbackDelayed(int, java.lang.Runnable, java.lang.Object, long);
    public void postFrameCallback(android.view.Choreographer$FrameCallback);
    public void postFrameCallbackDelayed(android.view.Choreographer$FrameCallback, long);
    public static void releaseInstance();
    public void removeCallbacks(int, java.lang.Runnable, java.lang.Object);
    public void removeFrameCallback(android.view.Choreographer$FrameCallback);
    public static void setFrameDelay(long);
    public static long subtractFrameDelay(long);


    public static int CALLBACK_ANIMATION;
    public static int CALLBACK_COMMIT;
    public static int CALLBACK_INPUT;
    public static int CALLBACK_TRAVERSAL;
}

-keep class android.view.Choreographer$FrameCallback {

    public abstract void doFrame(long);


}

-keep class android.view.ContextMenu {

    public abstract void clearHeader();
    public abstract android.view.ContextMenu setHeaderIcon(int);
    public abstract android.view.ContextMenu setHeaderIcon(android.graphics.drawable.Drawable);
    public abstract android.view.ContextMenu setHeaderTitle(int);
    public abstract android.view.ContextMenu setHeaderTitle(java.lang.CharSequence);
    public abstract android.view.ContextMenu setHeaderView(android.view.View);


}

-keep class android.view.ContextMenu$ContextMenuInfo {



}

-keep class android.view.ContextThemeWrapper {
    <init>();
    <init>(android.content.Context, int);
    <init>(android.content.Context, android.content.res.Resources$Theme);

    public void applyOverrideConfiguration(android.content.res.Configuration);
    protected void attachBaseContext(android.content.Context);
    public android.content.res.AssetManager getAssets();
    public android.content.res.Configuration getOverrideConfiguration();
    public android.content.res.Resources getResources();
    public java.lang.Object getSystemService(java.lang.String);
    public android.content.res.Resources$Theme getTheme();
    public int getThemeResId();
    protected void onApplyThemeResource(android.content.res.Resources$Theme, int, boolean);
    public void setTheme(int);


}

-keep class android.view.Display {
    <init>(android.hardware.display.DisplayManagerGlobal, int, android.view.DisplayInfo, android.view.DisplayAdjustments);
    <init>(android.hardware.display.DisplayManagerGlobal, int, android.view.DisplayInfo, android.content.res.Resources);

    public java.lang.String getAddress();
    public long getAppVsyncOffsetNanos();
    public int getColorMode();
    public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
    public android.view.DisplayAdjustments getDisplayAdjustments();
    public int getDisplayId();
    public boolean getDisplayInfo(android.view.DisplayInfo);
    public int getFlags();
    public android.view.Display$HdrCapabilities getHdrCapabilities();
    public int getHeight();
    public int getLayerStack();
    public int getMaximumSizeDimension();
    public void getMetrics(android.util.DisplayMetrics);
    public android.view.Display$Mode getMode();
    public java.lang.String getName();
    public int getOrientation();
    public void getOverscanInsets(android.graphics.Rect);
    public java.lang.String getOwnerPackageName();
    public int getOwnerUid();
    public int getPixelFormat();
    public long getPresentationDeadlineNanos();
    public void getRealMetrics(android.util.DisplayMetrics);
    public void getRealSize(android.graphics.Point);
    public void getRectSize(android.graphics.Rect);
    public float getRefreshRate();
    public int getRemoveMode();
    public int getRotation();
    public void getSize(android.graphics.Point);
    public int getState();
    public int[] getSupportedColorModes();
    public android.view.Display$Mode[] getSupportedModes();
    public float[] getSupportedRefreshRates();
    public int getType();
    public int getWidth();
    public boolean hasAccess(int);
    public static boolean hasAccess(int, int, int);
    public static boolean isDozeState(int);
    public boolean isHdr();
    public boolean isPublicPresentation();
    public static boolean isSuspendedState(int);
    public boolean isValid();
    public boolean isWideColorGamut();
    public void requestColorMode(int);
    public static java.lang.String stateToString(int);
    public java.lang.String toString();
    public static java.lang.String typeToString(int);


    public static int COLOR_MODE_ADOBE_RGB;
    public static int COLOR_MODE_BT601_525;
    public static int COLOR_MODE_BT601_525_UNADJUSTED;
    public static int COLOR_MODE_BT601_625;
    public static int COLOR_MODE_BT601_625_UNADJUSTED;
    public static int COLOR_MODE_BT709;
    public static int COLOR_MODE_DCI_P3;
    public static int COLOR_MODE_DEFAULT;
    public static int COLOR_MODE_DISPLAY_P3;
    public static int COLOR_MODE_INVALID;
    public static int COLOR_MODE_SRGB;
    public static int DEFAULT_DISPLAY;
    public static int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
    public static int FLAG_PRESENTATION;
    public static int FLAG_PRIVATE;
    public static int FLAG_ROUND;
    public static int FLAG_SCALING_DISABLED;
    public static int FLAG_SECURE;
    public static int FLAG_SUPPORTS_PROTECTED_BUFFERS;
    public static int INVALID_DISPLAY;
    public static int REMOVE_MODE_DESTROY_CONTENT;
    public static int REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY;
    public static int STATE_DOZE;
    public static int STATE_DOZE_SUSPEND;
    public static int STATE_OFF;
    public static int STATE_ON;
    public static int STATE_ON_SUSPEND;
    public static int STATE_UNKNOWN;
    public static int STATE_VR;
    public static int TYPE_BUILT_IN;
    public static int TYPE_HDMI;
    public static int TYPE_OVERLAY;
    public static int TYPE_UNKNOWN;
    public static int TYPE_VIRTUAL;
    public static int TYPE_WIFI;
}

-keep class android.view.Display$HdrCapabilities {
    <init>();
    <init>(int[], float, float, float);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public float getDesiredMaxAverageLuminance();
    public float getDesiredMaxLuminance();
    public float getDesiredMinLuminance();
    public int[] getSupportedHdrTypes();
    public int hashCode();
    public void readFromParcel(android.os.Parcel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int HDR_TYPE_DOLBY_VISION;
    public static int HDR_TYPE_HDR10;
    public static int HDR_TYPE_HLG;
    public static float INVALID_LUMINANCE;
}

-keep class android.view.Display$Mode {
    <init>(int, int, int, float);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getModeId();
    public int getPhysicalHeight();
    public int getPhysicalWidth();
    public float getRefreshRate();
    public int hashCode();
    public boolean matches(int, int, float);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static android.view.Display$Mode[] EMPTY_ARRAY;
}

-keep class android.view.DisplayAdjustments {
    <init>();
    <init>(android.content.res.Configuration);
    <init>(android.view.DisplayAdjustments);

    public boolean equals(java.lang.Object);
    public android.content.res.CompatibilityInfo getCompatibilityInfo();
    public android.content.res.Configuration getConfiguration();
    public int hashCode();
    public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
    public void setConfiguration(android.content.res.Configuration);


    public static android.view.DisplayAdjustments DEFAULT_DISPLAY_ADJUSTMENTS;
}

-keep class android.view.DisplayCutout {
    <init>(android.graphics.Rect, java.util.List);

    public boolean equals(java.lang.Object);
    public static android.view.DisplayCutout fromBoundingRect(int, int, int, int);
    public static android.view.DisplayCutout fromBounds(android.graphics.Region);
    public static android.view.DisplayCutout fromResourcesRectApproximation(android.content.res.Resources, int, int);
    public static android.view.DisplayCutout fromSpec(java.lang.String, int, int, float);
    public java.util.List getBoundingRects();
    public android.graphics.Region getBounds();
    public int getSafeInsetBottom();
    public int getSafeInsetLeft();
    public int getSafeInsetRight();
    public int getSafeInsetTop();
    public android.graphics.Rect getSafeInsets();
    public int hashCode();
    public android.view.DisplayCutout inset(int, int, int, int);
    public boolean isBoundsEmpty();
    public boolean isEmpty();
    public static android.graphics.Path pathFromResources(android.content.res.Resources, int, int);
    public android.view.DisplayCutout replaceSafeInsets(android.graphics.Rect);
    public java.lang.String toString();
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static java.lang.String EMULATION_OVERLAY_CATEGORY;
    public static android.view.DisplayCutout NO_CUTOUT;
}

-keep class android.view.DisplayCutout$ParcelableWrapper {
    <init>();
    <init>(android.view.DisplayCutout);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.view.DisplayCutout get();
    public int hashCode();
    public static android.view.DisplayCutout readCutoutFromParcel(android.os.Parcel);
    public void readFromParcel(android.os.Parcel);
    public void set(android.view.DisplayCutout$ParcelableWrapper);
    public void set(android.view.DisplayCutout);
    public java.lang.String toString();
    public static void writeCutoutToParcel(android.view.DisplayCutout, android.os.Parcel, int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.DisplayInfo {
    <init>();
    <init>(android.view.DisplayInfo);

    public void copyFrom(android.view.DisplayInfo);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public boolean equals(android.view.DisplayInfo);
    public int findDefaultModeByRefreshRate(float);
    public void getAppMetrics(android.util.DisplayMetrics);
    public void getAppMetrics(android.util.DisplayMetrics, android.view.DisplayAdjustments);
    public void getAppMetrics(android.util.DisplayMetrics, android.content.res.CompatibilityInfo, android.content.res.Configuration);
    public android.view.Display$Mode getDefaultMode();
    public float[] getDefaultRefreshRates();
    public void getLogicalMetrics(android.util.DisplayMetrics, android.content.res.CompatibilityInfo, android.content.res.Configuration);
    public android.view.Display$Mode getMode();
    public int getNaturalHeight();
    public int getNaturalWidth();
    public boolean hasAccess(int);
    public int hashCode();
    public boolean isHdr();
    public boolean isWideColorGamut();
    public void readFromParcel(android.os.Parcel);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String address;
    public int appHeight;
    public long appVsyncOffsetNanos;
    public int appWidth;
    public int colorMode;
    public int defaultModeId;
    public android.view.DisplayCutout displayCutout;
    public int flags;
    public android.view.Display$HdrCapabilities hdrCapabilities;
    public int largestNominalAppHeight;
    public int largestNominalAppWidth;
    public int layerStack;
    public int logicalDensityDpi;
    public int logicalHeight;
    public int logicalWidth;
    public int modeId;
    public java.lang.String name;
    public int overscanBottom;
    public int overscanLeft;
    public int overscanRight;
    public int overscanTop;
    public java.lang.String ownerPackageName;
    public int ownerUid;
    public float physicalXDpi;
    public float physicalYDpi;
    public long presentationDeadlineNanos;
    public int removeMode;
    public int rotation;
    public int smallestNominalAppHeight;
    public int smallestNominalAppWidth;
    public int state;
    public int[] supportedColorModes;
    public android.view.Display$Mode[] supportedModes;
    public int type;
    public java.lang.String uniqueId;
}

-keep class android.view.DisplayListCanvas {

    public void callDrawGLFunction2(long);
    public void drawCircle(android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty);
    public void drawGLFunctor2(long, java.lang.Runnable);
    public void drawRenderNode(android.view.RenderNode);
    public void drawRoundRect(android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty);
    public int getHeight();
    public int getMaximumBitmapHeight();
    public int getMaximumBitmapWidth();
    public int getWidth();
    public void insertInorderBarrier();
    public void insertReorderBarrier();
    public boolean isHardwareAccelerated();
    public boolean isOpaque();
    public boolean isRecordingFor(java.lang.Object);
    public void setBitmap(android.graphics.Bitmap);
    public void setDensity(int);
    protected void throwIfCannotDraw(android.graphics.Bitmap);


}

-keep class android.view.DragAndDropPermissions {

    public int describeContents();
    public static android.view.DragAndDropPermissions obtain(android.view.DragEvent);
    public void release();
    public boolean take(android.os.IBinder);
    public boolean takeTransient();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.DragEvent {

    public int describeContents();
    public int getAction();
    public android.content.ClipData getClipData();
    public android.content.ClipDescription getClipDescription();
    public com.android.internal.view.IDragAndDropPermissions getDragAndDropPermissions();
    public java.lang.Object getLocalState();
    public boolean getResult();
    public float getX();
    public float getY();
    public static android.view.DragEvent obtain(int, float, float, java.lang.Object, android.content.ClipDescription, android.content.ClipData, com.android.internal.view.IDragAndDropPermissions, boolean);
    public static android.view.DragEvent obtain(android.view.DragEvent);
    public void recycle();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTION_DRAG_ENDED;
    public static int ACTION_DRAG_ENTERED;
    public static int ACTION_DRAG_EXITED;
    public static int ACTION_DRAG_LOCATION;
    public static int ACTION_DRAG_STARTED;
    public static int ACTION_DROP;
    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.FrameMetrics {
    <init>(android.view.FrameMetrics);

    public long getMetric(int);


    public static int ANIMATION_DURATION;
    public static int COMMAND_ISSUE_DURATION;
    public static int DRAW_DURATION;
    public static int FIRST_DRAW_FRAME;
    public static int INPUT_HANDLING_DURATION;
    public static int INTENDED_VSYNC_TIMESTAMP;
    public static int LAYOUT_MEASURE_DURATION;
    public static int SWAP_BUFFERS_DURATION;
    public static int SYNC_DURATION;
    public static int TOTAL_DURATION;
    public static int UNKNOWN_DELAY_DURATION;
    public static int VSYNC_TIMESTAMP;
}

-keep class android.view.FrameStats {
    <init>();

    public long getEndTimeNano();
    public int getFrameCount();
    public long getFramePresentedTimeNano(int);
    public long getRefreshPeriodNano();
    public long getStartTimeNano();


    public static long UNDEFINED_TIME_NANO;
    protected long[] mFramesPresentedTimeNano;
    protected long mRefreshPeriodNano;
}

-keep class android.view.IAppTransitionAnimationSpecsFuture {

    public abstract android.view.AppTransitionAnimationSpec[] get();


}

-keep class android.view.IRecentsAnimationController {

    public abstract void finish(boolean);
    public abstract void hideCurrentInputMethod();
    public abstract android.app.ActivityManager$TaskSnapshot screenshotTask(int);
    public abstract void setAnimationTargetsBehindSystemBars(boolean);
    public abstract void setInputConsumerEnabled(boolean);
    public abstract void setSplitScreenMinimized(boolean);


}

-keep class android.view.IRecentsAnimationRunner {

    public abstract void onAnimationCanceled();
    public abstract void onAnimationStart(android.view.IRecentsAnimationController, android.view.RemoteAnimationTarget[], android.graphics.Rect, android.graphics.Rect);


}

-keep class android.view.IRemoteAnimationFinishedCallback {

    public abstract void onAnimationFinished();


}

-keep class android.view.IRemoteAnimationRunner {

    public abstract void onAnimationCancelled();
    public abstract void onAnimationStart(android.view.RemoteAnimationTarget[], android.view.IRemoteAnimationFinishedCallback);


}

-keep class android.view.IWindow {

    public abstract void closeSystemDialogs(java.lang.String);
    public abstract void dispatchAppVisibility(boolean);
    public abstract void dispatchDragEvent(android.view.DragEvent);
    public abstract void dispatchGetNewSurface();
    public abstract void dispatchPointerCaptureChanged(boolean);
    public abstract void dispatchSystemUiVisibilityChanged(int, int, int, int);
    public abstract void dispatchWallpaperCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
    public abstract void dispatchWallpaperOffsets(float, float, float, float, boolean);
    public abstract void dispatchWindowShown();
    public abstract void executeCommand(java.lang.String, java.lang.String, android.os.ParcelFileDescriptor);
    public abstract void moved(int, int);
    public abstract void requestAppKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
    public abstract void resized(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, boolean, android.util.MergedConfiguration, android.graphics.Rect, boolean, boolean, int, android.view.DisplayCutout$ParcelableWrapper);
    public abstract void updatePointerIcon(float, float);
    public abstract void windowFocusChanged(boolean, boolean);


}

-keep class android.view.IWindowFocusObserver {

    public abstract void focusGained(android.os.IBinder);
    public abstract void focusLost(android.os.IBinder);


}

-keep class android.view.IWindowId {

    public abstract boolean isFocused();
    public abstract void registerFocusObserver(android.view.IWindowFocusObserver);
    public abstract void unregisterFocusObserver(android.view.IWindowFocusObserver);


}

-keep class android.view.InflateException {
    <init>();
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.String);
    <init>(java.lang.Throwable);



}

-keep class android.view.InputChannel {
    <init>();

    public int describeContents();
    public void dispose();
    public android.view.InputChannel dup();
    protected void finalize();
    public java.lang.String getName();
    public static android.view.InputChannel[] openInputChannelPair(java.lang.String);
    public void readFromParcel(android.os.Parcel);
    public java.lang.String toString();
    public void transferTo(android.view.InputChannel);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.InputDevice {

    public int describeContents();
    public void disable();
    public void enable();
    public int getControllerNumber();
    public java.lang.String getDescriptor();
    public static android.view.InputDevice getDevice(int);
    public static int[] getDeviceIds();
    public int getGeneration();
    public int getId();
    public android.hardware.input.InputDeviceIdentifier getIdentifier();
    public android.view.KeyCharacterMap getKeyCharacterMap();
    public int getKeyboardType();
    public android.view.InputDevice$MotionRange getMotionRange(int);
    public android.view.InputDevice$MotionRange getMotionRange(int, int);
    public java.util.List getMotionRanges();
    public java.lang.String getName();
    public int getProductId();
    public int getSources();
    public int getVendorId();
    public android.os.Vibrator getVibrator();
    public boolean hasButtonUnderPad();
    public boolean[] hasKeys(int[]);
    public boolean hasMicrophone();
    public boolean isEnabled();
    public boolean isExternal();
    public boolean isFullKeyboard();
    public boolean isVirtual();
    public void setCustomPointerIcon(android.view.PointerIcon);
    public void setPointerType(int);
    public boolean supportsSource(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int KEYBOARD_TYPE_ALPHABETIC;
    public static int KEYBOARD_TYPE_NONE;
    public static int KEYBOARD_TYPE_NON_ALPHABETIC;
    public static int MOTION_RANGE_ORIENTATION;
    public static int MOTION_RANGE_PRESSURE;
    public static int MOTION_RANGE_SIZE;
    public static int MOTION_RANGE_TOOL_MAJOR;
    public static int MOTION_RANGE_TOOL_MINOR;
    public static int MOTION_RANGE_TOUCH_MAJOR;
    public static int MOTION_RANGE_TOUCH_MINOR;
    public static int MOTION_RANGE_X;
    public static int MOTION_RANGE_Y;
    public static int SOURCE_ANY;
    public static int SOURCE_BLUETOOTH_STYLUS;
    public static int SOURCE_CLASS_BUTTON;
    public static int SOURCE_CLASS_JOYSTICK;
    public static int SOURCE_CLASS_MASK;
    public static int SOURCE_CLASS_NONE;
    public static int SOURCE_CLASS_POINTER;
    public static int SOURCE_CLASS_POSITION;
    public static int SOURCE_CLASS_TRACKBALL;
    public static int SOURCE_DPAD;
    public static int SOURCE_GAMEPAD;
    public static int SOURCE_HDMI;
    public static int SOURCE_JOYSTICK;
    public static int SOURCE_KEYBOARD;
    public static int SOURCE_MOUSE;
    public static int SOURCE_MOUSE_RELATIVE;
    public static int SOURCE_ROTARY_ENCODER;
    public static int SOURCE_STYLUS;
    public static int SOURCE_TOUCHPAD;
    public static int SOURCE_TOUCHSCREEN;
    public static int SOURCE_TOUCH_NAVIGATION;
    public static int SOURCE_TRACKBALL;
    public static int SOURCE_UNKNOWN;
}

-keep class android.view.InputDevice$MotionRange {

    public int getAxis();
    public float getFlat();
    public float getFuzz();
    public float getMax();
    public float getMin();
    public float getRange();
    public float getResolution();
    public int getSource();
    public boolean isFromSource(int);


}

-keep class android.view.InputEvent {

    public abstract void cancel();
    public abstract android.view.InputEvent copy();
    public int describeContents();
    public android.view.InputDevice getDevice();
    public abstract int getDeviceId();
    public abstract long getEventTime();
    public abstract long getEventTimeNano();
    public int getSequenceNumber();
    public abstract int getSource();
    public boolean isFromSource(int);
    public abstract boolean isTainted();
    protected void prepareForReuse();
    public void recycle();
    public void recycleIfNeededAfterDispatch();
    public abstract void setSource(int);
    public abstract void setTainted(boolean);


    public static android.os.Parcelable$Creator CREATOR;
    protected static int PARCEL_TOKEN_KEY_EVENT;
    protected static int PARCEL_TOKEN_MOTION_EVENT;
    protected boolean mRecycled;
    protected int mSeq;
}

-keep class android.view.InputEventConsistencyVerifier {
    <init>(java.lang.Object, int);
    <init>(java.lang.Object, int, java.lang.String);

    public static boolean isInstrumentationEnabled();
    public void onGenericMotionEvent(android.view.MotionEvent, int);
    public void onInputEvent(android.view.InputEvent, int);
    public void onKeyEvent(android.view.KeyEvent, int);
    public void onTouchEvent(android.view.MotionEvent, int);
    public void onTrackballEvent(android.view.MotionEvent, int);
    public void onUnhandledEvent(android.view.InputEvent, int);
    public void reset();


    public static int FLAG_RAW_DEVICE_INPUT;
}

-keep class android.view.InputEventReceiver {
    <init>(android.view.InputChannel, android.os.Looper);

    public boolean consumeBatchedInputEvents(long);
    public void dispose();
    protected void finalize();
    public void finishInputEvent(android.view.InputEvent, boolean);
    public void onBatchedInputEventPending();
    public void onInputEvent(android.view.InputEvent, int);


}

-keep class android.view.InputQueue {
    <init>();

    public void dispose();
    public void dispose(boolean);
    protected void finalize();
    public long getNativePtr();
    public void sendInputEvent(android.view.InputEvent, java.lang.Object, boolean, android.view.InputQueue$FinishedInputEventCallback);


}

-keep class android.view.InputQueue$Callback {

    public abstract void onInputQueueCreated(android.view.InputQueue);
    public abstract void onInputQueueDestroyed(android.view.InputQueue);


}

-keep class android.view.InputQueue$FinishedInputEventCallback {

    public abstract void onFinishedInputEvent(java.lang.Object, boolean);


}

-keep class android.view.KeyCharacterMap {

    public int describeContents();
    public static boolean deviceHasKey(int);
    public static boolean[] deviceHasKeys(int[]);
    protected void finalize();
    public int get(int, int);
    public static int getDeadChar(int, int);
    public char getDisplayLabel(int);
    public android.view.KeyEvent[] getEvents(char[]);
    public android.view.KeyCharacterMap$FallbackAction getFallbackAction(int, int);
    public boolean getKeyData(int, android.view.KeyCharacterMap$KeyData);
    public int getKeyboardType();
    public char getMatch(int, char[]);
    public char getMatch(int, char[], int);
    public int getModifierBehavior();
    public char getNumber(int);
    public boolean isPrintingKey(int);
    public static android.view.KeyCharacterMap load(int);
    public void writeToParcel(android.os.Parcel, int);


    public static int ALPHA;
    public static int BUILT_IN_KEYBOARD;
    public static int COMBINING_ACCENT;
    public static int COMBINING_ACCENT_MASK;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FULL;
    public static char HEX_INPUT;
    public static int MODIFIER_BEHAVIOR_CHORDED;
    public static int MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED;
    public static int NUMERIC;
    public static char PICKER_DIALOG_INPUT;
    public static int PREDICTIVE;
    public static int SPECIAL_FUNCTION;
    public static int VIRTUAL_KEYBOARD;
}

-keep class android.view.KeyCharacterMap$FallbackAction {

    public static android.view.KeyCharacterMap$FallbackAction obtain();
    public void recycle();


    public int keyCode;
    public int metaState;
}

-keep class android.view.KeyCharacterMap$KeyData {
    <init>();



    public static int META_LENGTH;
    public char displayLabel;
    public char[] meta;
    public char number;
}

-keep class android.view.KeyEvent {
    <init>(int, int);
    <init>(long, long, int, int, int);
    <init>(long, long, int, int, int, int);
    <init>(long, long, int, int, int, int, int, int);
    <init>(long, long, int, int, int, int, int, int, int);
    <init>(long, long, int, int, int, int, int, int, int, int);
    <init>(long, java.lang.String, int, int);
    <init>(android.view.KeyEvent);
    <init>(android.view.KeyEvent, long, int);

    public static java.lang.String actionToString(int);
    public void cancel();
    public static android.view.KeyEvent changeAction(android.view.KeyEvent, int);
    public static android.view.KeyEvent changeFlags(android.view.KeyEvent, int);
    public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int);
    public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int, int);
    public android.view.KeyEvent copy();
    public android.view.InputEvent copy();
    public static android.view.KeyEvent createFromParcelBody(android.os.Parcel);
    public boolean dispatch(android.view.KeyEvent$Callback);
    public boolean dispatch(android.view.KeyEvent$Callback, android.view.KeyEvent$DispatcherState, java.lang.Object);
    public int getAction();
    public java.lang.String getCharacters();
    public static int getDeadChar(int, int);
    public int getDeviceId();
    public char getDisplayLabel();
    public long getDownTime();
    public long getEventTime();
    public long getEventTimeNano();
    public int getFlags();
    public android.view.KeyCharacterMap getKeyCharacterMap();
    public int getKeyCode();
    public boolean getKeyData(android.view.KeyCharacterMap$KeyData);
    public int getKeyboardDevice();
    public char getMatch(char[]);
    public char getMatch(char[], int);
    public static int getMaxKeyCode();
    public int getMetaState();
    public static int getModifierMetaStateMask();
    public int getModifiers();
    public char getNumber();
    public int getRepeatCount();
    public int getScanCode();
    public int getSource();
    public int getUnicodeChar();
    public int getUnicodeChar(int);
    public boolean hasModifiers(int);
    public boolean hasNoModifiers();
    public static boolean isAltKey(int);
    public boolean isAltPressed();
    public boolean isCanceled();
    public boolean isCapsLockOn();
    public static boolean isConfirmKey(int);
    public boolean isCtrlPressed();
    public boolean isDown();
    public boolean isFunctionPressed();
    public static boolean isGamepadButton(int);
    public boolean isLongPress();
    public static boolean isMediaKey(int);
    public static boolean isMetaKey(int);
    public boolean isMetaPressed();
    public static boolean isModifierKey(int);
    public boolean isNumLockOn();
    public boolean isPrintingKey();
    public boolean isScrollLockOn();
    public boolean isShiftPressed();
    public boolean isSymPressed();
    public boolean isSystem();
    public static boolean isSystemKey(int);
    public boolean isTainted();
    public boolean isTracking();
    public boolean isWakeKey();
    public static boolean isWakeKey(int);
    public static int keyCodeFromString(java.lang.String);
    public static java.lang.String keyCodeToString(int);
    public static boolean metaStateHasModifiers(int, int);
    public static boolean metaStateHasNoModifiers(int);
    public static java.lang.String metaStateToString(int);
    public static int normalizeMetaState(int);
    public static android.view.KeyEvent obtain(long, long, int, int, int, int, int, int, int, int, java.lang.String);
    public static android.view.KeyEvent obtain(android.view.KeyEvent);
    public void recycle();
    public void recycleIfNeededAfterDispatch();
    public void setSource(int);
    public void setTainted(boolean);
    public void startTracking();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTION_DOWN;
    public static int ACTION_MULTIPLE;
    public static int ACTION_UP;
    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_CANCELED;
    public static int FLAG_CANCELED_LONG_PRESS;
    public static int FLAG_EDITOR_ACTION;
    public static int FLAG_FALLBACK;
    public static int FLAG_FROM_SYSTEM;
    public static int FLAG_KEEP_TOUCH_MODE;
    public static int FLAG_LONG_PRESS;
    public static int FLAG_PREDISPATCH;
    public static int FLAG_SOFT_KEYBOARD;
    public static int FLAG_START_TRACKING;
    public static int FLAG_TAINTED;
    public static int FLAG_TRACKING;
    public static int FLAG_VIRTUAL_HARD_KEY;
    public static int FLAG_WOKE_HERE;
    public static int KEYCODE_0;
    public static int KEYCODE_1;
    public static int KEYCODE_11;
    public static int KEYCODE_12;
    public static int KEYCODE_2;
    public static int KEYCODE_3;
    public static int KEYCODE_3D_MODE;
    public static int KEYCODE_4;
    public static int KEYCODE_5;
    public static int KEYCODE_6;
    public static int KEYCODE_7;
    public static int KEYCODE_8;
    public static int KEYCODE_9;
    public static int KEYCODE_A;
    public static int KEYCODE_ALL_APPS;
    public static int KEYCODE_ALT_LEFT;
    public static int KEYCODE_ALT_RIGHT;
    public static int KEYCODE_APOSTROPHE;
    public static int KEYCODE_APP_SWITCH;
    public static int KEYCODE_ASSIST;
    public static int KEYCODE_AT;
    public static int KEYCODE_AVR_INPUT;
    public static int KEYCODE_AVR_POWER;
    public static int KEYCODE_B;
    public static int KEYCODE_BACK;
    public static int KEYCODE_BACKSLASH;
    public static int KEYCODE_BOOKMARK;
    public static int KEYCODE_BREAK;
    public static int KEYCODE_BRIGHTNESS_DOWN;
    public static int KEYCODE_BRIGHTNESS_UP;
    public static int KEYCODE_BUTTON_1;
    public static int KEYCODE_BUTTON_10;
    public static int KEYCODE_BUTTON_11;
    public static int KEYCODE_BUTTON_12;
    public static int KEYCODE_BUTTON_13;
    public static int KEYCODE_BUTTON_14;
    public static int KEYCODE_BUTTON_15;
    public static int KEYCODE_BUTTON_16;
    public static int KEYCODE_BUTTON_2;
    public static int KEYCODE_BUTTON_3;
    public static int KEYCODE_BUTTON_4;
    public static int KEYCODE_BUTTON_5;
    public static int KEYCODE_BUTTON_6;
    public static int KEYCODE_BUTTON_7;
    public static int KEYCODE_BUTTON_8;
    public static int KEYCODE_BUTTON_9;
    public static int KEYCODE_BUTTON_A;
    public static int KEYCODE_BUTTON_B;
    public static int KEYCODE_BUTTON_C;
    public static int KEYCODE_BUTTON_L1;
    public static int KEYCODE_BUTTON_L2;
    public static int KEYCODE_BUTTON_MODE;
    public static int KEYCODE_BUTTON_R1;
    public static int KEYCODE_BUTTON_R2;
    public static int KEYCODE_BUTTON_SELECT;
    public static int KEYCODE_BUTTON_START;
    public static int KEYCODE_BUTTON_THUMBL;
    public static int KEYCODE_BUTTON_THUMBR;
    public static int KEYCODE_BUTTON_X;
    public static int KEYCODE_BUTTON_Y;
    public static int KEYCODE_BUTTON_Z;
    public static int KEYCODE_C;
    public static int KEYCODE_CALCULATOR;
    public static int KEYCODE_CALENDAR;
    public static int KEYCODE_CALL;
    public static int KEYCODE_CAMERA;
    public static int KEYCODE_CAPS_LOCK;
    public static int KEYCODE_CAPTIONS;
    public static int KEYCODE_CHANNEL_DOWN;
    public static int KEYCODE_CHANNEL_UP;
    public static int KEYCODE_CLEAR;
    public static int KEYCODE_COMMA;
    public static int KEYCODE_CONTACTS;
    public static int KEYCODE_COPY;
    public static int KEYCODE_CTRL_LEFT;
    public static int KEYCODE_CTRL_RIGHT;
    public static int KEYCODE_CUT;
    public static int KEYCODE_D;
    public static int KEYCODE_DEL;
    public static int KEYCODE_DPAD_CENTER;
    public static int KEYCODE_DPAD_DOWN;
    public static int KEYCODE_DPAD_DOWN_LEFT;
    public static int KEYCODE_DPAD_DOWN_RIGHT;
    public static int KEYCODE_DPAD_LEFT;
    public static int KEYCODE_DPAD_RIGHT;
    public static int KEYCODE_DPAD_UP;
    public static int KEYCODE_DPAD_UP_LEFT;
    public static int KEYCODE_DPAD_UP_RIGHT;
    public static int KEYCODE_DVR;
    public static int KEYCODE_E;
    public static int KEYCODE_EISU;
    public static int KEYCODE_ENDCALL;
    public static int KEYCODE_ENTER;
    public static int KEYCODE_ENVELOPE;
    public static int KEYCODE_EQUALS;
    public static int KEYCODE_ESCAPE;
    public static int KEYCODE_EXPLORER;
    public static int KEYCODE_F;
    public static int KEYCODE_F1;
    public static int KEYCODE_F10;
    public static int KEYCODE_F11;
    public static int KEYCODE_F12;
    public static int KEYCODE_F2;
    public static int KEYCODE_F3;
    public static int KEYCODE_F4;
    public static int KEYCODE_F5;
    public static int KEYCODE_F6;
    public static int KEYCODE_F7;
    public static int KEYCODE_F8;
    public static int KEYCODE_F9;
    public static int KEYCODE_FOCUS;
    public static int KEYCODE_FORWARD;
    public static int KEYCODE_FORWARD_DEL;
    public static int KEYCODE_FUNCTION;
    public static int KEYCODE_G;
    public static int KEYCODE_GRAVE;
    public static int KEYCODE_GUIDE;
    public static int KEYCODE_H;
    public static int KEYCODE_HEADSETHOOK;
    public static int KEYCODE_HELP;
    public static int KEYCODE_HENKAN;
    public static int KEYCODE_HOME;
    public static int KEYCODE_I;
    public static int KEYCODE_INFO;
    public static int KEYCODE_INSERT;
    public static int KEYCODE_J;
    public static int KEYCODE_K;
    public static int KEYCODE_KANA;
    public static int KEYCODE_KATAKANA_HIRAGANA;
    public static int KEYCODE_L;
    public static int KEYCODE_LANGUAGE_SWITCH;
    public static int KEYCODE_LAST_CHANNEL;
    public static int KEYCODE_LEFT_BRACKET;
    public static int KEYCODE_M;
    public static int KEYCODE_MANNER_MODE;
    public static int KEYCODE_MEDIA_AUDIO_TRACK;
    public static int KEYCODE_MEDIA_CLOSE;
    public static int KEYCODE_MEDIA_EJECT;
    public static int KEYCODE_MEDIA_FAST_FORWARD;
    public static int KEYCODE_MEDIA_NEXT;
    public static int KEYCODE_MEDIA_PAUSE;
    public static int KEYCODE_MEDIA_PLAY;
    public static int KEYCODE_MEDIA_PLAY_PAUSE;
    public static int KEYCODE_MEDIA_PREVIOUS;
    public static int KEYCODE_MEDIA_RECORD;
    public static int KEYCODE_MEDIA_REWIND;
    public static int KEYCODE_MEDIA_SKIP_BACKWARD;
    public static int KEYCODE_MEDIA_SKIP_FORWARD;
    public static int KEYCODE_MEDIA_STEP_BACKWARD;
    public static int KEYCODE_MEDIA_STEP_FORWARD;
    public static int KEYCODE_MEDIA_STOP;
    public static int KEYCODE_MEDIA_TOP_MENU;
    public static int KEYCODE_MENU;
    public static int KEYCODE_META_LEFT;
    public static int KEYCODE_META_RIGHT;
    public static int KEYCODE_MINUS;
    public static int KEYCODE_MOVE_END;
    public static int KEYCODE_MOVE_HOME;
    public static int KEYCODE_MUHENKAN;
    public static int KEYCODE_MUSIC;
    public static int KEYCODE_MUTE;
    public static int KEYCODE_N;
    public static int KEYCODE_NAVIGATE_IN;
    public static int KEYCODE_NAVIGATE_NEXT;
    public static int KEYCODE_NAVIGATE_OUT;
    public static int KEYCODE_NAVIGATE_PREVIOUS;
    public static int KEYCODE_NOTIFICATION;
    public static int KEYCODE_NUM;
    public static int KEYCODE_NUMPAD_0;
    public static int KEYCODE_NUMPAD_1;
    public static int KEYCODE_NUMPAD_2;
    public static int KEYCODE_NUMPAD_3;
    public static int KEYCODE_NUMPAD_4;
    public static int KEYCODE_NUMPAD_5;
    public static int KEYCODE_NUMPAD_6;
    public static int KEYCODE_NUMPAD_7;
    public static int KEYCODE_NUMPAD_8;
    public static int KEYCODE_NUMPAD_9;
    public static int KEYCODE_NUMPAD_ADD;
    public static int KEYCODE_NUMPAD_COMMA;
    public static int KEYCODE_NUMPAD_DIVIDE;
    public static int KEYCODE_NUMPAD_DOT;
    public static int KEYCODE_NUMPAD_ENTER;
    public static int KEYCODE_NUMPAD_EQUALS;
    public static int KEYCODE_NUMPAD_LEFT_PAREN;
    public static int KEYCODE_NUMPAD_MULTIPLY;
    public static int KEYCODE_NUMPAD_RIGHT_PAREN;
    public static int KEYCODE_NUMPAD_SUBTRACT;
    public static int KEYCODE_NUM_LOCK;
    public static int KEYCODE_O;
    public static int KEYCODE_P;
    public static int KEYCODE_PAGE_DOWN;
    public static int KEYCODE_PAGE_UP;
    public static int KEYCODE_PAIRING;
    public static int KEYCODE_PASTE;
    public static int KEYCODE_PERIOD;
    public static int KEYCODE_PICTSYMBOLS;
    public static int KEYCODE_PLUS;
    public static int KEYCODE_POUND;
    public static int KEYCODE_POWER;
    public static int KEYCODE_PROG_BLUE;
    public static int KEYCODE_PROG_GREEN;
    public static int KEYCODE_PROG_RED;
    public static int KEYCODE_PROG_YELLOW;
    public static int KEYCODE_Q;
    public static int KEYCODE_R;
    public static int KEYCODE_REFRESH;
    public static int KEYCODE_RIGHT_BRACKET;
    public static int KEYCODE_RO;
    public static int KEYCODE_S;
    public static int KEYCODE_SCROLL_LOCK;
    public static int KEYCODE_SEARCH;
    public static int KEYCODE_SEMICOLON;
    public static int KEYCODE_SETTINGS;
    public static int KEYCODE_SHIFT_LEFT;
    public static int KEYCODE_SHIFT_RIGHT;
    public static int KEYCODE_SLASH;
    public static int KEYCODE_SLEEP;
    public static int KEYCODE_SOFT_LEFT;
    public static int KEYCODE_SOFT_RIGHT;
    public static int KEYCODE_SOFT_SLEEP;
    public static int KEYCODE_SPACE;
    public static int KEYCODE_STAR;
    public static int KEYCODE_STB_INPUT;
    public static int KEYCODE_STB_POWER;
    public static int KEYCODE_STEM_1;
    public static int KEYCODE_STEM_2;
    public static int KEYCODE_STEM_3;
    public static int KEYCODE_STEM_PRIMARY;
    public static int KEYCODE_SWITCH_CHARSET;
    public static int KEYCODE_SYM;
    public static int KEYCODE_SYSRQ;
    public static int KEYCODE_SYSTEM_NAVIGATION_DOWN;
    public static int KEYCODE_SYSTEM_NAVIGATION_LEFT;
    public static int KEYCODE_SYSTEM_NAVIGATION_RIGHT;
    public static int KEYCODE_SYSTEM_NAVIGATION_UP;
    public static int KEYCODE_T;
    public static int KEYCODE_TAB;
    public static int KEYCODE_TV;
    public static int KEYCODE_TV_ANTENNA_CABLE;
    public static int KEYCODE_TV_AUDIO_DESCRIPTION;
    public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN;
    public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP;
    public static int KEYCODE_TV_CONTENTS_MENU;
    public static int KEYCODE_TV_DATA_SERVICE;
    public static int KEYCODE_TV_INPUT;
    public static int KEYCODE_TV_INPUT_COMPONENT_1;
    public static int KEYCODE_TV_INPUT_COMPONENT_2;
    public static int KEYCODE_TV_INPUT_COMPOSITE_1;
    public static int KEYCODE_TV_INPUT_COMPOSITE_2;
    public static int KEYCODE_TV_INPUT_HDMI_1;
    public static int KEYCODE_TV_INPUT_HDMI_2;
    public static int KEYCODE_TV_INPUT_HDMI_3;
    public static int KEYCODE_TV_INPUT_HDMI_4;
    public static int KEYCODE_TV_INPUT_VGA_1;
    public static int KEYCODE_TV_MEDIA_CONTEXT_MENU;
    public static int KEYCODE_TV_NETWORK;
    public static int KEYCODE_TV_NUMBER_ENTRY;
    public static int KEYCODE_TV_POWER;
    public static int KEYCODE_TV_RADIO_SERVICE;
    public static int KEYCODE_TV_SATELLITE;
    public static int KEYCODE_TV_SATELLITE_BS;
    public static int KEYCODE_TV_SATELLITE_CS;
    public static int KEYCODE_TV_SATELLITE_SERVICE;
    public static int KEYCODE_TV_TELETEXT;
    public static int KEYCODE_TV_TERRESTRIAL_ANALOG;
    public static int KEYCODE_TV_TERRESTRIAL_DIGITAL;
    public static int KEYCODE_TV_TIMER_PROGRAMMING;
    public static int KEYCODE_TV_ZOOM_MODE;
    public static int KEYCODE_U;
    public static int KEYCODE_UNKNOWN;
    public static int KEYCODE_V;
    public static int KEYCODE_VOICE_ASSIST;
    public static int KEYCODE_VOLUME_DOWN;
    public static int KEYCODE_VOLUME_MUTE;
    public static int KEYCODE_VOLUME_UP;
    public static int KEYCODE_W;
    public static int KEYCODE_WAKEUP;
    public static int KEYCODE_WINDOW;
    public static int KEYCODE_X;
    public static int KEYCODE_Y;
    public static int KEYCODE_YEN;
    public static int KEYCODE_Z;
    public static int KEYCODE_ZENKAKU_HANKAKU;
    public static int KEYCODE_ZOOM_IN;
    public static int KEYCODE_ZOOM_OUT;
    public static int MAX_KEYCODE;
    public static int META_ALT_LEFT_ON;
    public static int META_ALT_LOCKED;
    public static int META_ALT_MASK;
    public static int META_ALT_ON;
    public static int META_ALT_RIGHT_ON;
    public static int META_CAPS_LOCK_ON;
    public static int META_CAP_LOCKED;
    public static int META_CTRL_LEFT_ON;
    public static int META_CTRL_MASK;
    public static int META_CTRL_ON;
    public static int META_CTRL_RIGHT_ON;
    public static int META_FUNCTION_ON;
    public static int META_META_LEFT_ON;
    public static int META_META_MASK;
    public static int META_META_ON;
    public static int META_META_RIGHT_ON;
    public static int META_NUM_LOCK_ON;
    public static int META_SCROLL_LOCK_ON;
    public static int META_SELECTING;
    public static int META_SHIFT_LEFT_ON;
    public static int META_SHIFT_MASK;
    public static int META_SHIFT_ON;
    public static int META_SHIFT_RIGHT_ON;
    public static int META_SYM_LOCKED;
    public static int META_SYM_ON;
}

-keep class android.view.KeyEvent$Callback {

    public abstract boolean onKeyDown(int, android.view.KeyEvent);
    public abstract boolean onKeyLongPress(int, android.view.KeyEvent);
    public abstract boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public abstract boolean onKeyUp(int, android.view.KeyEvent);


}

-keep class android.view.KeyEvent$DispatcherState {
    <init>();

    public void handleUpEvent(android.view.KeyEvent);
    public boolean isTracking(android.view.KeyEvent);
    public void performedLongPress(android.view.KeyEvent);
    public void reset();
    public void reset(java.lang.Object);
    public void startTracking(android.view.KeyEvent, java.lang.Object);


}

-keep class android.view.KeyboardShortcutGroup {
    <init>(java.lang.CharSequence, java.util.List);
    <init>(java.lang.CharSequence);
    <init>(java.lang.CharSequence, java.util.List, boolean);
    <init>(java.lang.CharSequence, boolean);

    public void addItem(android.view.KeyboardShortcutInfo);
    public int describeContents();
    public java.util.List getItems();
    public java.lang.CharSequence getLabel();
    public boolean isSystemGroup();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.KeyboardShortcutInfo {
    <init>(java.lang.CharSequence, android.graphics.drawable.Icon, int, int);
    <init>(java.lang.CharSequence, int, int);
    <init>(java.lang.CharSequence, char, int);

    public int describeContents();
    public char getBaseCharacter();
    public android.graphics.drawable.Icon getIcon();
    public int getKeycode();
    public java.lang.CharSequence getLabel();
    public int getModifiers();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.LayoutInflater {
    <init>(android.content.Context);
    <init>(android.view.LayoutInflater, android.content.Context);

    public abstract android.view.LayoutInflater cloneInContext(android.content.Context);
    public android.view.View createView(java.lang.String, java.lang.String, android.util.AttributeSet);
    public static android.view.LayoutInflater from(android.content.Context);
    public android.content.Context getContext();
    public android.view.LayoutInflater$Factory getFactory();
    public android.view.LayoutInflater$Factory2 getFactory2();
    public android.view.LayoutInflater$Filter getFilter();
    public android.view.View inflate(int, android.view.ViewGroup);
    public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup);
    public android.view.View inflate(int, android.view.ViewGroup, boolean);
    public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean);
    protected android.view.View onCreateView(java.lang.String, android.util.AttributeSet);
    protected android.view.View onCreateView(android.view.View, java.lang.String, android.util.AttributeSet);
    public void setFactory(android.view.LayoutInflater$Factory);
    public void setFactory2(android.view.LayoutInflater$Factory2);
    public void setFilter(android.view.LayoutInflater$Filter);
    public void setPrivateFactory(android.view.LayoutInflater$Factory2);


    protected android.content.Context mContext;
}

-keep class android.view.LayoutInflater$Factory {

    public abstract android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);


}

-keep class android.view.LayoutInflater$Factory2 {

    public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);


}

-keep class android.view.LayoutInflater$Filter {

    public abstract boolean onLoadClass(java.lang.Class);


}

-keep class android.view.MagnificationSpec {

    public void clear();
    public int describeContents();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public void initialize(float, float, float);
    public boolean isNop();
    public static android.view.MagnificationSpec obtain(android.view.MagnificationSpec);
    public static android.view.MagnificationSpec obtain();
    public void recycle();
    public void setTo(android.view.MagnificationSpec);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public float offsetX;
    public float offsetY;
    public float scale;
}

-keep class android.view.Menu {

    public abstract android.view.MenuItem add(java.lang.CharSequence);
    public abstract android.view.MenuItem add(int);
    public abstract android.view.MenuItem add(int, int, int, java.lang.CharSequence);
    public abstract android.view.MenuItem add(int, int, int, int);
    public abstract int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
    public abstract android.view.SubMenu addSubMenu(java.lang.CharSequence);
    public abstract android.view.SubMenu addSubMenu(int);
    public abstract android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
    public abstract android.view.SubMenu addSubMenu(int, int, int, int);
    public abstract void clear();
    public abstract void close();
    public abstract android.view.MenuItem findItem(int);
    public abstract android.view.MenuItem getItem(int);
    public abstract boolean hasVisibleItems();
    public abstract boolean isShortcutKey(int, android.view.KeyEvent);
    public abstract boolean performIdentifierAction(int, int);
    public abstract boolean performShortcut(int, android.view.KeyEvent, int);
    public abstract void removeGroup(int);
    public abstract void removeItem(int);
    public abstract void setGroupCheckable(int, boolean, boolean);
    public void setGroupDividerEnabled(boolean);
    public abstract void setGroupEnabled(int, boolean);
    public abstract void setGroupVisible(int, boolean);
    public abstract void setQwertyMode(boolean);
    public abstract int size();


    public static int CATEGORY_ALTERNATIVE;
    public static int CATEGORY_CONTAINER;
    public static int CATEGORY_MASK;
    public static int CATEGORY_SECONDARY;
    public static int CATEGORY_SHIFT;
    public static int CATEGORY_SYSTEM;
    public static int FIRST;
    public static int FLAG_ALWAYS_PERFORM_CLOSE;
    public static int FLAG_APPEND_TO_GROUP;
    public static int FLAG_PERFORM_NO_CLOSE;
    public static int NONE;
    public static int SUPPORTED_MODIFIERS_MASK;
    public static int USER_MASK;
    public static int USER_SHIFT;
}

-keep class android.view.MenuInflater {
    <init>(android.content.Context);
    <init>(android.content.Context, java.lang.Object);

    public void inflate(int, android.view.Menu);


}

-keep class android.view.MenuItem {

    public abstract boolean collapseActionView();
    public abstract boolean expandActionView();
    public abstract android.view.ActionProvider getActionProvider();
    public abstract android.view.View getActionView();
    public int getAlphabeticModifiers();
    public abstract char getAlphabeticShortcut();
    public java.lang.CharSequence getContentDescription();
    public abstract int getGroupId();
    public abstract android.graphics.drawable.Drawable getIcon();
    public android.content.res.ColorStateList getIconTintList();
    public android.graphics.PorterDuff$Mode getIconTintMode();
    public abstract android.content.Intent getIntent();
    public abstract int getItemId();
    public abstract android.view.ContextMenu$ContextMenuInfo getMenuInfo();
    public int getNumericModifiers();
    public abstract char getNumericShortcut();
    public abstract int getOrder();
    public abstract android.view.SubMenu getSubMenu();
    public abstract java.lang.CharSequence getTitle();
    public abstract java.lang.CharSequence getTitleCondensed();
    public java.lang.CharSequence getTooltipText();
    public abstract boolean hasSubMenu();
    public abstract boolean isActionViewExpanded();
    public abstract boolean isCheckable();
    public abstract boolean isChecked();
    public abstract boolean isEnabled();
    public abstract boolean isVisible();
    public boolean requiresActionButton();
    public boolean requiresOverflow();
    public abstract android.view.MenuItem setActionProvider(android.view.ActionProvider);
    public abstract android.view.MenuItem setActionView(android.view.View);
    public abstract android.view.MenuItem setActionView(int);
    public abstract android.view.MenuItem setAlphabeticShortcut(char);
    public android.view.MenuItem setAlphabeticShortcut(char, int);
    public abstract android.view.MenuItem setCheckable(boolean);
    public abstract android.view.MenuItem setChecked(boolean);
    public android.view.MenuItem setContentDescription(java.lang.CharSequence);
    public abstract android.view.MenuItem setEnabled(boolean);
    public abstract android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    public abstract android.view.MenuItem setIcon(int);
    public android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff$Mode);
    public abstract android.view.MenuItem setIntent(android.content.Intent);
    public abstract android.view.MenuItem setNumericShortcut(char);
    public android.view.MenuItem setNumericShortcut(char, int);
    public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener);
    public abstract android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem$OnMenuItemClickListener);
    public abstract android.view.MenuItem setShortcut(char, char);
    public android.view.MenuItem setShortcut(char, char, int, int);
    public abstract void setShowAsAction(int);
    public abstract android.view.MenuItem setShowAsActionFlags(int);
    public abstract android.view.MenuItem setTitle(java.lang.CharSequence);
    public abstract android.view.MenuItem setTitle(int);
    public abstract android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
    public android.view.MenuItem setTooltipText(java.lang.CharSequence);
    public abstract android.view.MenuItem setVisible(boolean);


    public static int SHOW_AS_ACTION_ALWAYS;
    public static int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW;
    public static int SHOW_AS_ACTION_IF_ROOM;
    public static int SHOW_AS_ACTION_NEVER;
    public static int SHOW_AS_ACTION_WITH_TEXT;
}

-keep class android.view.MenuItem$OnActionExpandListener {

    public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
    public abstract boolean onMenuItemActionExpand(android.view.MenuItem);


}

-keep class android.view.MenuItem$OnMenuItemClickListener {

    public abstract boolean onMenuItemClick(android.view.MenuItem);


}

-keep class android.view.MotionEvent {

    public static java.lang.String actionToString(int);
    public void addBatch(long, float, float, float, float, int);
    public void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
    public boolean addBatch(android.view.MotionEvent);
    public static int axisFromString(java.lang.String);
    public static java.lang.String axisToString(int);
    public static java.lang.String buttonStateToString(int);
    public void cancel();
    public android.view.MotionEvent clampNoHistory(float, float, float, float);
    public android.view.MotionEvent copy();
    public android.view.InputEvent copy();
    public static android.view.MotionEvent createFromParcelBody(android.os.Parcel);
    protected void finalize();
    public int findPointerIndex(int);
    public int getAction();
    public int getActionButton();
    public int getActionIndex();
    public int getActionMasked();
    public float getAxisValue(int);
    public float getAxisValue(int, int);
    public int getButtonState();
    public int getDeviceId();
    public long getDownTime();
    public int getEdgeFlags();
    public long getEventTime();
    public long getEventTimeNano();
    public int getFlags();
    public float getHistoricalAxisValue(int, int);
    public float getHistoricalAxisValue(int, int, int);
    public long getHistoricalEventTime(int);
    public long getHistoricalEventTimeNano(int);
    public float getHistoricalOrientation(int);
    public float getHistoricalOrientation(int, int);
    public void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
    public float getHistoricalPressure(int);
    public float getHistoricalPressure(int, int);
    public float getHistoricalSize(int);
    public float getHistoricalSize(int, int);
    public float getHistoricalToolMajor(int);
    public float getHistoricalToolMajor(int, int);
    public float getHistoricalToolMinor(int);
    public float getHistoricalToolMinor(int, int);
    public float getHistoricalTouchMajor(int);
    public float getHistoricalTouchMajor(int, int);
    public float getHistoricalTouchMinor(int);
    public float getHistoricalTouchMinor(int, int);
    public float getHistoricalX(int);
    public float getHistoricalX(int, int);
    public float getHistoricalY(int);
    public float getHistoricalY(int, int);
    public int getHistorySize();
    public int getMetaState();
    public float getOrientation();
    public float getOrientation(int);
    public void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
    public int getPointerCount();
    public int getPointerId(int);
    public int getPointerIdBits();
    public void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
    public float getPressure();
    public float getPressure(int);
    public float getRawX();
    public float getRawY();
    public float getSize();
    public float getSize(int);
    public int getSource();
    public float getToolMajor();
    public float getToolMajor(int);
    public float getToolMinor();
    public float getToolMinor(int);
    public int getToolType(int);
    public float getTouchMajor();
    public float getTouchMajor(int);
    public float getTouchMinor();
    public float getTouchMinor(int);
    public float getX();
    public float getX(int);
    public float getXPrecision();
    public float getY();
    public float getY(int);
    public float getYPrecision();
    public boolean isButtonPressed(int);
    public boolean isHoverExitPending();
    public boolean isTainted();
    public boolean isTargetAccessibilityFocus();
    public boolean isTouchEvent();
    public boolean isWithinBoundsNoHistory(float, float, float, float);
    public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
    public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
    public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
    public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
    public static android.view.MotionEvent obtain(long, long, int, float, float, int);
    public static android.view.MotionEvent obtain(android.view.MotionEvent);
    public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
    public void offsetLocation(float, float);
    public void recycle();
    public void scale(float);
    public void setAction(int);
    public void setActionButton(int);
    public void setButtonState(int);
    public void setDownTime(long);
    public void setEdgeFlags(int);
    public void setHoverExitPending(boolean);
    public void setLocation(float, float);
    public void setSource(int);
    public void setTainted(boolean);
    public void setTargetAccessibilityFocus(boolean);
    public android.view.MotionEvent split(int);
    public java.lang.String toString();
    public static java.lang.String toolTypeToString(int);
    public void transform(android.graphics.Matrix);
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTION_BUTTON_PRESS;
    public static int ACTION_BUTTON_RELEASE;
    public static int ACTION_CANCEL;
    public static int ACTION_DOWN;
    public static int ACTION_HOVER_ENTER;
    public static int ACTION_HOVER_EXIT;
    public static int ACTION_HOVER_MOVE;
    public static int ACTION_MASK;
    public static int ACTION_MOVE;
    public static int ACTION_OUTSIDE;
    public static int ACTION_POINTER_1_DOWN;
    public static int ACTION_POINTER_1_UP;
    public static int ACTION_POINTER_2_DOWN;
    public static int ACTION_POINTER_2_UP;
    public static int ACTION_POINTER_3_DOWN;
    public static int ACTION_POINTER_3_UP;
    public static int ACTION_POINTER_DOWN;
    public static int ACTION_POINTER_ID_MASK;
    public static int ACTION_POINTER_ID_SHIFT;
    public static int ACTION_POINTER_INDEX_MASK;
    public static int ACTION_POINTER_INDEX_SHIFT;
    public static int ACTION_POINTER_UP;
    public static int ACTION_SCROLL;
    public static int ACTION_UP;
    public static int AXIS_BRAKE;
    public static int AXIS_DISTANCE;
    public static int AXIS_GAS;
    public static int AXIS_GENERIC_1;
    public static int AXIS_GENERIC_10;
    public static int AXIS_GENERIC_11;
    public static int AXIS_GENERIC_12;
    public static int AXIS_GENERIC_13;
    public static int AXIS_GENERIC_14;
    public static int AXIS_GENERIC_15;
    public static int AXIS_GENERIC_16;
    public static int AXIS_GENERIC_2;
    public static int AXIS_GENERIC_3;
    public static int AXIS_GENERIC_4;
    public static int AXIS_GENERIC_5;
    public static int AXIS_GENERIC_6;
    public static int AXIS_GENERIC_7;
    public static int AXIS_GENERIC_8;
    public static int AXIS_GENERIC_9;
    public static int AXIS_HAT_X;
    public static int AXIS_HAT_Y;
    public static int AXIS_HSCROLL;
    public static int AXIS_LTRIGGER;
    public static int AXIS_ORIENTATION;
    public static int AXIS_PRESSURE;
    public static int AXIS_RELATIVE_X;
    public static int AXIS_RELATIVE_Y;
    public static int AXIS_RTRIGGER;
    public static int AXIS_RUDDER;
    public static int AXIS_RX;
    public static int AXIS_RY;
    public static int AXIS_RZ;
    public static int AXIS_SCROLL;
    public static int AXIS_SIZE;
    public static int AXIS_THROTTLE;
    public static int AXIS_TILT;
    public static int AXIS_TOOL_MAJOR;
    public static int AXIS_TOOL_MINOR;
    public static int AXIS_TOUCH_MAJOR;
    public static int AXIS_TOUCH_MINOR;
    public static int AXIS_VSCROLL;
    public static int AXIS_WHEEL;
    public static int AXIS_X;
    public static int AXIS_Y;
    public static int AXIS_Z;
    public static int BUTTON_BACK;
    public static int BUTTON_FORWARD;
    public static int BUTTON_PRIMARY;
    public static int BUTTON_SECONDARY;
    public static int BUTTON_STYLUS_PRIMARY;
    public static int BUTTON_STYLUS_SECONDARY;
    public static int BUTTON_TERTIARY;
    public static android.os.Parcelable$Creator CREATOR;
    public static int EDGE_BOTTOM;
    public static int EDGE_LEFT;
    public static int EDGE_RIGHT;
    public static int EDGE_TOP;
    public static int FLAG_HOVER_EXIT_PENDING;
    public static int FLAG_IS_GENERATED_GESTURE;
    public static int FLAG_TAINTED;
    public static int FLAG_TARGET_ACCESSIBILITY_FOCUS;
    public static int FLAG_WINDOW_IS_OBSCURED;
    public static int FLAG_WINDOW_IS_PARTIALLY_OBSCURED;
    public static int INVALID_POINTER_ID;
    public static int TOOL_TYPE_ERASER;
    public static int TOOL_TYPE_FINGER;
    public static int TOOL_TYPE_MOUSE;
    public static int TOOL_TYPE_STYLUS;
    public static int TOOL_TYPE_UNKNOWN;
}

-keep class android.view.MotionEvent$PointerCoords {
    <init>();
    <init>(android.view.MotionEvent$PointerCoords);

    public void clear();
    public void copyFrom(android.view.MotionEvent$PointerCoords);
    public static android.view.MotionEvent$PointerCoords[] createArray(int);
    public float getAxisValue(int);
    public void setAxisValue(int, float);


    public float orientation;
    public float pressure;
    public float size;
    public float toolMajor;
    public float toolMinor;
    public float touchMajor;
    public float touchMinor;
    public float x;
    public float y;
}

-keep class android.view.MotionEvent$PointerProperties {
    <init>();
    <init>(android.view.MotionEvent$PointerProperties);

    public void clear();
    public void copyFrom(android.view.MotionEvent$PointerProperties);
    public static android.view.MotionEvent$PointerProperties[] createArray(int);
    public boolean equals(java.lang.Object);
    public int hashCode();


    public int id;
    public int toolType;
}

-keep class android.view.PointerIcon {

    public static android.view.PointerIcon create(android.graphics.Bitmap, float, float);
    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.view.PointerIcon getDefaultIcon(android.content.Context);
    public static android.view.PointerIcon getNullIcon();
    public static android.view.PointerIcon getSystemIcon(android.content.Context, int);
    public int getType();
    public static android.view.PointerIcon load(android.content.res.Resources, int);
    public android.view.PointerIcon load(android.content.Context);
    public static void setUseLargeIcons(boolean);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int TYPE_ALIAS;
    public static int TYPE_ALL_SCROLL;
    public static int TYPE_ARROW;
    public static int TYPE_CELL;
    public static int TYPE_CONTEXT_MENU;
    public static int TYPE_COPY;
    public static int TYPE_CROSSHAIR;
    public static int TYPE_CUSTOM;
    public static int TYPE_DEFAULT;
    public static int TYPE_GRAB;
    public static int TYPE_GRABBING;
    public static int TYPE_HAND;
    public static int TYPE_HELP;
    public static int TYPE_HORIZONTAL_DOUBLE_ARROW;
    public static int TYPE_NOT_SPECIFIED;
    public static int TYPE_NO_DROP;
    public static int TYPE_NULL;
    public static int TYPE_SPOT_ANCHOR;
    public static int TYPE_SPOT_HOVER;
    public static int TYPE_SPOT_TOUCH;
    public static int TYPE_TEXT;
    public static int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
    public static int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
    public static int TYPE_VERTICAL_DOUBLE_ARROW;
    public static int TYPE_VERTICAL_TEXT;
    public static int TYPE_WAIT;
    public static int TYPE_ZOOM_IN;
    public static int TYPE_ZOOM_OUT;
}

-keep class android.view.RecordingCanvas {
    <init>(long);

    public void drawARGB(int, int, int, int);
    public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
    public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
    public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
    public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
    public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
    public void drawCircle(float, float, float, android.graphics.Paint);
    public void drawColor(int);
    public void drawColor(int, android.graphics.PorterDuff$Mode);
    public void drawLine(float, float, float, float, android.graphics.Paint);
    public void drawLines(float[], int, int, android.graphics.Paint);
    public void drawLines(float[], android.graphics.Paint);
    public void drawOval(float, float, float, float, android.graphics.Paint);
    public void drawOval(android.graphics.RectF, android.graphics.Paint);
    public void drawPaint(android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
    public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
    public void drawPath(android.graphics.Path, android.graphics.Paint);
    public void drawPicture(android.graphics.Picture);
    public void drawPicture(android.graphics.Picture, android.graphics.Rect);
    public void drawPicture(android.graphics.Picture, android.graphics.RectF);
    public void drawPoint(float, float, android.graphics.Paint);
    public void drawPoints(float[], int, int, android.graphics.Paint);
    public void drawPoints(float[], android.graphics.Paint);
    public void drawPosText(char[], int, int, float[], android.graphics.Paint);
    public void drawPosText(java.lang.String, float[], android.graphics.Paint);
    public void drawRGB(int, int, int);
    public void drawRect(float, float, float, float, android.graphics.Paint);
    public void drawRect(android.graphics.Rect, android.graphics.Paint);
    public void drawRect(android.graphics.RectF, android.graphics.Paint);
    public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
    public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    public void drawText(char[], int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, float, float, android.graphics.Paint);
    public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
    public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
    public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
    public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);


}

-keep class android.view.RemoteAnimationAdapter {
    <init>(android.view.IRemoteAnimationRunner, long, long);
    <init>(android.os.Parcel);

    public int describeContents();
    public int getCallingPid();
    public long getDuration();
    public android.view.IRemoteAnimationRunner getRunner();
    public long getStatusBarTransitionDelay();
    public void setCallingPid(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.RemoteAnimationDefinition {
    <init>();
    <init>(android.os.Parcel);

    public void addRemoteAnimation(int, int, android.view.RemoteAnimationAdapter);
    public void addRemoteAnimation(int, android.view.RemoteAnimationAdapter);
    public int describeContents();
    public android.view.RemoteAnimationAdapter getAdapter(int, android.util.ArraySet);
    public boolean hasTransition(int, android.util.ArraySet);
    public void setCallingPid(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.RemoteAnimationTarget {
    <init>(int, int, android.view.SurfaceControl, boolean, android.graphics.Rect, android.graphics.Rect, int, android.graphics.Point, android.graphics.Rect, android.app.WindowConfiguration, boolean);
    <init>(android.os.Parcel);

    public int describeContents();
    public void dump(java.io.PrintWriter, java.lang.String);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static android.os.Parcelable$Creator CREATOR;
    public static int MODE_CLOSING;
    public static int MODE_OPENING;
    public android.graphics.Rect clipRect;
    public android.graphics.Rect contentInsets;
    public boolean isNotInRecents;
    public boolean isTranslucent;
    public android.view.SurfaceControl leash;
    public int mode;
    public android.graphics.Point position;
    public int prefixOrderIndex;
    public android.graphics.Rect sourceContainerBounds;
    public int taskId;
    public android.app.WindowConfiguration windowConfiguration;
}

-keep class android.view.RenderNode {

    public void addAnimator(android.view.RenderNodeAnimator);
    public static android.view.RenderNode adopt(long);
    public static android.view.RenderNode create(java.lang.String, android.view.View);
    public void destroy();
    public void discardDisplayList();
    public void end(android.view.DisplayListCanvas);
    public void endAllAnimators();
    public float getAlpha();
    public int getAmbientShadowColor();
    public float getCameraDistance();
    public boolean getClipToOutline();
    public int getDebugSize();
    public float getElevation();
    public void getInverseMatrix(android.graphics.Matrix);
    public void getMatrix(android.graphics.Matrix);
    public float getPivotX();
    public float getPivotY();
    public float getRotation();
    public float getRotationX();
    public float getRotationY();
    public float getScaleX();
    public float getScaleY();
    public int getSpotShadowColor();
    public float getTranslationX();
    public float getTranslationY();
    public float getTranslationZ();
    public boolean hasIdentityMatrix();
    public boolean hasOverlappingRendering();
    public boolean hasShadow();
    public boolean isAttached();
    public boolean isPivotExplicitlySet();
    public boolean isValid();
    public boolean offsetLeftAndRight(int);
    public boolean offsetTopAndBottom(int);
    public void output();
    public void registerVectorDrawableAnimator(android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT);
    public void requestPositionUpdates(android.view.SurfaceView);
    public boolean resetPivot();
    public boolean setAlpha(float);
    public boolean setAmbientShadowColor(int);
    public boolean setAnimationMatrix(android.graphics.Matrix);
    public boolean setBottom(int);
    public boolean setCameraDistance(float);
    public boolean setClipBounds(android.graphics.Rect);
    public boolean setClipToBounds(boolean);
    public boolean setClipToOutline(boolean);
    public boolean setElevation(float);
    public boolean setHasOverlappingRendering(boolean);
    public boolean setLayerPaint(android.graphics.Paint);
    public boolean setLayerType(int);
    public boolean setLeft(int);
    public boolean setLeftTopRightBottom(int, int, int, int);
    public boolean setOutline(android.graphics.Outline);
    public boolean setPivotX(float);
    public boolean setPivotY(float);
    public boolean setProjectBackwards(boolean);
    public boolean setProjectionReceiver(boolean);
    public boolean setRevealClip(boolean, float, float, float);
    public boolean setRight(int);
    public boolean setRotation(float);
    public boolean setRotationX(float);
    public boolean setRotationY(float);
    public boolean setScaleX(float);
    public boolean setScaleY(float);
    public boolean setSpotShadowColor(int);
    public boolean setStaticMatrix(android.graphics.Matrix);
    public boolean setTop(int);
    public boolean setTranslationX(float);
    public boolean setTranslationY(float);
    public boolean setTranslationZ(float);
    public android.view.DisplayListCanvas start(int, int);


}

-keep class android.view.RenderNodeAnimator {
    <init>(int, float);
    <init>(android.graphics.CanvasProperty, float);
    <init>(android.graphics.CanvasProperty, int, float);
    <init>(int, int, float, float);

    public void cancel();
    public android.animation.Animator clone();
    public java.lang.Object clone();
    public void end();
    public long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public long getStartDelay();
    public long getTotalDuration();
    public boolean isRunning();
    public boolean isStarted();
    public static int mapViewPropertyToRenderProperty(int);
    protected void onFinished();
    public void pause();
    public void resume();
    public void setAllowRunningAsynchronously(boolean);
    public android.view.RenderNodeAnimator setDuration(long);
    public android.animation.Animator setDuration(long);
    public void setInterpolator(android.animation.TimeInterpolator);
    public void setStartDelay(long);
    public void setStartValue(float);
    public void setTarget(android.view.View);
    public void setTarget(android.view.DisplayListCanvas);
    public void start();


    public static int ALPHA;
    public static int LAST_VALUE;
    public static int PAINT_ALPHA;
    public static int PAINT_STROKE_WIDTH;
    public static int ROTATION;
    public static int ROTATION_X;
    public static int ROTATION_Y;
    public static int SCALE_X;
    public static int SCALE_Y;
    public static int TRANSLATION_X;
    public static int TRANSLATION_Y;
    public static int TRANSLATION_Z;
    public static int X;
    public static int Y;
    public static int Z;
}

-keep class android.view.SearchEvent {
    <init>(android.view.InputDevice);

    public android.view.InputDevice getInputDevice();


}

-keep class android.view.SubMenu {

    public abstract void clearHeader();
    public abstract android.view.MenuItem getItem();
    public abstract android.view.SubMenu setHeaderIcon(int);
    public abstract android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
    public abstract android.view.SubMenu setHeaderTitle(int);
    public abstract android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
    public abstract android.view.SubMenu setHeaderView(android.view.View);
    public abstract android.view.SubMenu setIcon(int);
    public abstract android.view.SubMenu setIcon(android.graphics.drawable.Drawable);


}

-keep class android.view.Surface {
    <init>();
    <init>(android.graphics.SurfaceTexture);

    public void allocateBuffers();
    public void attachAndQueueBuffer(android.graphics.GraphicBuffer);
    public void copyFrom(android.view.SurfaceControl);
    public void createFrom(android.view.SurfaceControl);
    public int describeContents();
    public void destroy();
    protected void finalize();
    public int getGenerationId();
    public long getNextFrameNumber();
    public void hwuiDestroy();
    public boolean isAutoRefreshEnabled();
    public boolean isConsumerRunningBehind();
    public boolean isSharedBufferModeEnabled();
    public boolean isSingleBuffered();
    public boolean isValid();
    public android.graphics.Canvas lockCanvas(android.graphics.Rect);
    public android.graphics.Canvas lockHardwareCanvas();
    public android.graphics.Canvas lockHardwareWideColorGamutCanvas();
    public void readFromParcel(android.os.Parcel);
    public void release();
    public static java.lang.String rotationToString(int);
    public void setAutoRefreshEnabled(boolean);
    public void setSharedBufferModeEnabled(boolean);
    public java.lang.String toString();
    public void transferFrom(android.view.Surface);
    public void unlockCanvas(android.graphics.Canvas);
    public void unlockCanvasAndPost(android.graphics.Canvas);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int ROTATION_0;
    public static int ROTATION_180;
    public static int ROTATION_270;
    public static int ROTATION_90;
    public static int SCALING_MODE_FREEZE;
    public static int SCALING_MODE_NO_SCALE_CROP;
    public static int SCALING_MODE_SCALE_CROP;
    public static int SCALING_MODE_SCALE_TO_WINDOW;
}

-keep class android.view.Surface$OutOfResourcesException {
    <init>();
    <init>(java.lang.String);



}

-keep class android.view.SurfaceControl {
    <init>(android.view.SurfaceControl);

    public static android.graphics.GraphicBuffer captureLayers(android.os.IBinder, android.graphics.Rect, float);
    public static boolean clearAnimationFrameStats();
    public boolean clearContentFrameStats();
    public static void closeTransaction();
    public static void closeTransactionSync();
    public static android.os.IBinder createDisplay(java.lang.String, boolean);
    public void deferTransactionUntil(android.os.IBinder, long);
    public void deferTransactionUntil(android.view.Surface, long);
    public int describeContents();
    public void destroy();
    public static void destroyDisplay(android.os.IBinder);
    public void detachChildren();
    public void disconnect();
    protected void finalize();
    public static int getActiveColorMode(android.os.IBinder);
    public static int getActiveConfig(android.os.IBinder);
    public static boolean getAnimationFrameStats(android.view.WindowAnimationFrameStats);
    public static android.os.IBinder getBuiltInDisplay(int);
    public boolean getContentFrameStats(android.view.WindowContentFrameStats);
    public static int[] getDisplayColorModes(android.os.IBinder);
    public static android.view.SurfaceControl$PhysicalDisplayInfo[] getDisplayConfigs(android.os.IBinder);
    public android.os.IBinder getHandle();
    public static android.view.Display$HdrCapabilities getHdrCapabilities(android.os.IBinder);
    public int getHeight();
    public int getWidth();
    public void hide();
    public static void mergeToGlobalTransaction(android.view.SurfaceControl$Transaction);
    public static void openTransaction();
    public void release();
    public void reparent(android.os.IBinder);
    public void reparentChildren(android.os.IBinder);
    public static void screenshot(android.os.IBinder, android.view.Surface, int, int, int, int, boolean);
    public static void screenshot(android.os.IBinder, android.view.Surface, int, int);
    public static void screenshot(android.os.IBinder, android.view.Surface);
    public static android.graphics.Bitmap screenshot(android.graphics.Rect, int, int, int, int, boolean, int);
    public static android.graphics.Bitmap screenshot(android.graphics.Rect, int, int, int);
    public static android.graphics.GraphicBuffer screenshotToBuffer(android.graphics.Rect, int, int, int, int, boolean, int);
    public static boolean setActiveColorMode(android.os.IBinder, int);
    public static boolean setActiveConfig(android.os.IBinder, int);
    public void setAlpha(float);
    public static void setAnimationTransaction();
    public void setColor(float[]);
    public static void setDisplayLayerStack(android.os.IBinder, int);
    public static void setDisplayPowerMode(android.os.IBinder, int);
    public static void setDisplayProjection(android.os.IBinder, int, android.graphics.Rect, android.graphics.Rect);
    public static void setDisplaySize(android.os.IBinder, int, int);
    public static void setDisplaySurface(android.os.IBinder, android.view.Surface);
    public void setFinalCrop(android.graphics.Rect);
    public void setGeometryAppliesWithResize();
    public void setLayer(int);
    public void setLayerStack(int);
    public void setMatrix(float, float, float, float);
    public void setMatrix(android.graphics.Matrix, float[]);
    public void setOpaque(boolean);
    public void setOverrideScalingMode(int);
    public void setPosition(float, float);
    public void setRelativeLayer(android.view.SurfaceControl, int);
    public void setSecure(boolean);
    public void setSize(int, int);
    public void setTransparentRegionHint(android.graphics.Region);
    public void setWindowCrop(android.graphics.Rect);
    public void show();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int BUILT_IN_DISPLAY_ID_HDMI;
    public static int BUILT_IN_DISPLAY_ID_MAIN;
    public static android.os.Parcelable$Creator CREATOR;
    public static int CURSOR_WINDOW;
    public static int FX_SURFACE_DIM;
    public static int FX_SURFACE_MASK;
    public static int FX_SURFACE_NORMAL;
    public static int HIDDEN;
    public static int NON_PREMULTIPLIED;
    public static int OPAQUE;
    public static int POWER_MODE_DOZE;
    public static int POWER_MODE_DOZE_SUSPEND;
    public static int POWER_MODE_NORMAL;
    public static int POWER_MODE_OFF;
    public static int POWER_MODE_ON_SUSPEND;
    public static int PROTECTED_APP;
    public static int SECURE;
    public static int WINDOW_TYPE_DONT_SCREENSHOT;
}

-keep class android.view.SurfaceControl$PhysicalDisplayInfo {
    <init>();
    <init>(android.view.SurfaceControl$PhysicalDisplayInfo);

    public void copyFrom(android.view.SurfaceControl$PhysicalDisplayInfo);
    public boolean equals(java.lang.Object);
    public boolean equals(android.view.SurfaceControl$PhysicalDisplayInfo);
    public int hashCode();
    public java.lang.String toString();


    public long appVsyncOffsetNanos;
    public float density;
    public int height;
    public long presentationDeadlineNanos;
    public float refreshRate;
    public boolean secure;
    public int width;
    public float xDpi;
    public float yDpi;
}

-keep class android.view.SurfaceControl$Transaction {
    <init>();

    public void apply();
    public void apply(boolean);
    public void close();
    public android.view.SurfaceControl$Transaction deferTransactionUntil(android.view.SurfaceControl, android.os.IBinder, long);
    public android.view.SurfaceControl$Transaction deferTransactionUntilSurface(android.view.SurfaceControl, android.view.Surface, long);
    public android.view.SurfaceControl$Transaction destroy(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction detachChildren(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction hide(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction merge(android.view.SurfaceControl$Transaction);
    public android.view.SurfaceControl$Transaction reparent(android.view.SurfaceControl, android.os.IBinder);
    public android.view.SurfaceControl$Transaction reparentChildren(android.view.SurfaceControl, android.os.IBinder);
    public android.view.SurfaceControl$Transaction setAlpha(android.view.SurfaceControl, float);
    public android.view.SurfaceControl$Transaction setAnimationTransaction();
    public android.view.SurfaceControl$Transaction setColor(android.view.SurfaceControl, float[]);
    public android.view.SurfaceControl$Transaction setDisplayLayerStack(android.os.IBinder, int);
    public android.view.SurfaceControl$Transaction setDisplayProjection(android.os.IBinder, int, android.graphics.Rect, android.graphics.Rect);
    public android.view.SurfaceControl$Transaction setDisplaySize(android.os.IBinder, int, int);
    public android.view.SurfaceControl$Transaction setDisplaySurface(android.os.IBinder, android.view.Surface);
    public android.view.SurfaceControl$Transaction setEarlyWakeup();
    public android.view.SurfaceControl$Transaction setFinalCrop(android.view.SurfaceControl, android.graphics.Rect);
    public android.view.SurfaceControl$Transaction setGeometryAppliesWithResize(android.view.SurfaceControl);
    public android.view.SurfaceControl$Transaction setLayer(android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setLayerStack(android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setMatrix(android.view.SurfaceControl, float, float, float, float);
    public android.view.SurfaceControl$Transaction setMatrix(android.view.SurfaceControl, android.graphics.Matrix, float[]);
    public android.view.SurfaceControl$Transaction setOpaque(android.view.SurfaceControl, boolean);
    public android.view.SurfaceControl$Transaction setOverrideScalingMode(android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setPosition(android.view.SurfaceControl, float, float);
    public android.view.SurfaceControl$Transaction setRelativeLayer(android.view.SurfaceControl, android.view.SurfaceControl, int);
    public android.view.SurfaceControl$Transaction setSecure(android.view.SurfaceControl, boolean);
    public android.view.SurfaceControl$Transaction setSize(android.view.SurfaceControl, int, int);
    public android.view.SurfaceControl$Transaction setTransparentRegionHint(android.view.SurfaceControl, android.graphics.Region);
    public android.view.SurfaceControl$Transaction setWindowCrop(android.view.SurfaceControl, android.graphics.Rect);
    public android.view.SurfaceControl$Transaction show(android.view.SurfaceControl);


    public static libcore.util.NativeAllocationRegistry sRegistry;
}

-keep class android.view.SurfaceHolder {

    public abstract void addCallback(android.view.SurfaceHolder$Callback);
    public abstract android.view.Surface getSurface();
    public abstract android.graphics.Rect getSurfaceFrame();
    public abstract boolean isCreating();
    public abstract android.graphics.Canvas lockCanvas();
    public abstract android.graphics.Canvas lockCanvas(android.graphics.Rect);
    public android.graphics.Canvas lockHardwareCanvas();
    public abstract void removeCallback(android.view.SurfaceHolder$Callback);
    public abstract void setFixedSize(int, int);
    public abstract void setFormat(int);
    public abstract void setKeepScreenOn(boolean);
    public abstract void setSizeFromLayout();
    public abstract void setType(int);
    public abstract void unlockCanvasAndPost(android.graphics.Canvas);


    public static int SURFACE_TYPE_GPU;
    public static int SURFACE_TYPE_HARDWARE;
    public static int SURFACE_TYPE_NORMAL;
    public static int SURFACE_TYPE_PUSH_BUFFERS;
}

-keep class android.view.SurfaceHolder$Callback {

    public abstract void surfaceChanged(android.view.SurfaceHolder, int, int, int);
    public abstract void surfaceCreated(android.view.SurfaceHolder);
    public abstract void surfaceDestroyed(android.view.SurfaceHolder);


}

-keep class android.view.SurfaceHolder$Callback2 {

    public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
    public void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);


}

-keep class android.view.SurfaceView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    protected void applyChildSurfaceTransaction_renderWorker(android.view.SurfaceControl$Transaction, android.view.Surface, long);
    protected void dispatchDraw(android.graphics.Canvas);
    public void draw(android.graphics.Canvas);
    public boolean gatherTransparentRegion(android.graphics.Region);
    public android.view.SurfaceHolder getHolder();
    public boolean isFixedSize();
    protected void onAttachedToWindow();
    protected void onDetachedFromWindow();
    protected void onMeasure(int, int);
    protected void onWindowVisibilityChanged(int);
    protected boolean setFrame(int, int, int, int);
    public void setResizeBackgroundColor(int);
    public void setSecure(boolean);
    public void setVisibility(int);
    public void setZOrderMediaOverlay(boolean);
    public void setZOrderOnTop(boolean);
    public void surfacePositionLost_uiRtSync(long);
    protected void updateSurface();
    public void updateSurfacePosition_renderWorker(long, int, int, int, int);
    public void windowStopped(boolean);


}

-keep class android.view.ThreadedRenderer {

    public void addRenderNode(android.view.RenderNode, boolean);
    public static int copySurfaceInto(android.view.Surface, android.graphics.Rect, android.graphics.Bitmap);
    public static android.view.ThreadedRenderer create(android.content.Context, boolean, java.lang.String);
    public static android.graphics.Bitmap createHardwareBitmap(android.view.RenderNode, int, int);
    public static void disable(boolean);
    public static void disableVsync();
    public void drawRenderNode(android.view.RenderNode);
    public static void enableForegroundTrimming();
    protected void finalize();
    public static boolean isAvailable();
    public void notifyFramePending();
    public static void overrideProperty(java.lang.String, java.lang.String);
    public void removeRenderNode(android.view.RenderNode);
    public void serializeDisplayListTree();
    public void setContentDrawBounds(int, int, int, int);
    public static void setContextPriority(int);
    public static void setDebuggingEnabled(boolean);
    public static void setFPSDivisor(int);
    public static void setHighContrastText(boolean);
    public static void setIsolatedProcess(boolean);
    public static void setupDiskCache(java.io.File);
    public static void trimMemory(int);


    public static java.lang.String DEBUG_DIRTY_REGIONS_PROPERTY;
    public static java.lang.String DEBUG_FPS_DIVISOR;
    public static java.lang.String DEBUG_OVERDRAW_PROPERTY;
    public static java.lang.String DEBUG_SHOW_LAYERS_UPDATES_PROPERTY;
    public static java.lang.String DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY;
    public static int EGL_CONTEXT_PRIORITY_HIGH_IMG;
    public static int EGL_CONTEXT_PRIORITY_LOW_IMG;
    public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
    public static java.lang.String OVERDRAW_PROPERTY_SHOW;
    public static java.lang.String PROFILE_PROPERTY;
    public static java.lang.String PROFILE_PROPERTY_VISUALIZE_BARS;
    public static boolean sRendererDisabled;
    public static boolean sSystemRendererDisabled;
    public static boolean sTrimForeground;
}

-keep class android.view.ThreadedRenderer$FrameDrawingCallback {

    public abstract void onFrameDraw(long);


}

-keep class android.view.TouchDelegate {
    <init>(android.graphics.Rect, android.view.View);

    public boolean onTouchEvent(android.view.MotionEvent);


    public static int ABOVE;
    public static int BELOW;
    public static int TO_LEFT;
    public static int TO_RIGHT;
}

-keep class android.view.View {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addChildrenForAccessibility(java.util.ArrayList);
    public void addExtraDataToAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
    public void addFocusables(java.util.ArrayList, int);
    public void addFocusables(java.util.ArrayList, int, int);
    public void addFrameMetricsListener(android.view.Window, android.view.Window$OnFrameMetricsAvailableListener, android.os.Handler);
    public void addKeyboardNavigationClusters(java.util.Collection, int);
    public void addOnAttachStateChangeListener(android.view.View$OnAttachStateChangeListener);
    public void addOnLayoutChangeListener(android.view.View$OnLayoutChangeListener);
    public void addOnUnhandledKeyEventListener(android.view.View$OnUnhandledKeyEventListener);
    public void addTouchables(java.util.ArrayList);
    public android.view.ViewPropertyAnimator animate();
    public void announceForAccessibility(java.lang.CharSequence);
    public void applyDrawableToTransparentRegion(android.graphics.drawable.Drawable, android.graphics.Region);
    public void autofill(android.view.autofill.AutofillValue);
    public void autofill(android.util.SparseArray);
    protected boolean awakenScrollBars();
    protected boolean awakenScrollBars(int);
    protected boolean awakenScrollBars(int, boolean);
    public void bringToFront();
    public void buildDrawingCache();
    public void buildDrawingCache(boolean);
    public void buildLayer();
    public boolean callOnClick();
    public boolean canHaveDisplayList();
    public boolean canNotifyAutofillEnterExitEvent();
    public boolean canResolveLayoutDirection();
    public boolean canResolveTextAlignment();
    public boolean canResolveTextDirection();
    public boolean canScrollHorizontally(int);
    public boolean canScrollVertically(int);
    public void cancelDragAndDrop();
    public void cancelLongPress();
    public void cancelPendingInputEvents();
    public void captureTransitioningViews(java.util.List);
    public boolean checkInputConnectionProxy(android.view.View);
    public void clearAccessibilityFocus();
    public void clearAnimation();
    public void clearFocus();
    public static int combineMeasuredStates(int, int);
    protected boolean computeFitSystemWindows(android.graphics.Rect, android.graphics.Rect);
    protected int computeHorizontalScrollExtent();
    protected int computeHorizontalScrollOffset();
    protected int computeHorizontalScrollRange();
    protected void computeOpaqueFlags();
    public void computeScroll();
    public android.view.WindowInsets computeSystemWindowInsets(android.view.WindowInsets, android.graphics.Rect);
    protected int computeVerticalScrollExtent();
    protected int computeVerticalScrollOffset();
    protected int computeVerticalScrollRange();
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo();
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfoInternal();
    public void createContextMenu(android.view.ContextMenu);
    public android.graphics.Bitmap createSnapshot(android.view.ViewDebug$CanvasProvider, boolean);
    protected void damageInParent();
    public void debug();
    protected void debug(int);
    protected static java.lang.String debugIndent(int);
    public void destroyDrawingCache();
    protected void destroyHardwareResources();
    public boolean dispatchActivityResult(java.lang.String, int, int, android.content.Intent);
    public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
    public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
    public void dispatchConfigurationChanged(android.content.res.Configuration);
    public void dispatchDisplayHint(int);
    public boolean dispatchDragEvent(android.view.DragEvent);
    protected void dispatchDraw(android.graphics.Canvas);
    public void dispatchDrawableHotspotChanged(float, float);
    public void dispatchFinishTemporaryDetach();
    protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
    public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
    protected void dispatchGetDisplayList();
    protected boolean dispatchHoverEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public boolean dispatchNestedFling(float, float, boolean);
    public boolean dispatchNestedPreFling(float, float);
    public boolean dispatchNestedPrePerformAccessibilityAction(int, android.os.Bundle);
    public boolean dispatchNestedPreScroll(int, int, int[], int[]);
    public boolean dispatchNestedScroll(int, int, int, int, int[]);
    public void dispatchPointerCaptureChanged(boolean);
    public boolean dispatchPointerEvent(android.view.MotionEvent);
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
    public void dispatchProvideStructure(android.view.ViewStructure);
    protected void dispatchRestoreInstanceState(android.util.SparseArray);
    protected void dispatchSaveInstanceState(android.util.SparseArray);
    protected void dispatchSetActivated(boolean);
    protected void dispatchSetPressed(boolean);
    protected void dispatchSetSelected(boolean);
    public void dispatchStartTemporaryDetach();
    public void dispatchSystemUiVisibilityChanged(int);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public boolean dispatchUnhandledMove(android.view.View, int);
    protected void dispatchVisibilityChanged(android.view.View, int);
    public void dispatchWindowFocusChanged(boolean);
    public void dispatchWindowSystemUiVisiblityChanged(int);
    public void dispatchWindowVisibilityChanged(int);
    public void draw(android.graphics.Canvas);
    public void drawableHotspotChanged(float, float);
    protected void drawableStateChanged();
    public void encode(android.view.ViewHierarchyEncoder);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public android.view.View findFocus();
    public void findNamedViews(java.util.Map);
    public android.view.View findViewByAccessibilityIdTraversal(int);
    public android.view.View findViewByAutofillIdTraversal(int);
    public android.view.View findViewById(int);
    public android.view.View findViewByPredicate(java.util.function.Predicate);
    public android.view.View findViewByPredicateInsideOut(android.view.View, java.util.function.Predicate);
    protected android.view.View findViewByPredicateTraversal(java.util.function.Predicate, android.view.View);
    protected android.view.View findViewTraversal(int);
    public android.view.View findViewWithTag(java.lang.Object);
    protected android.view.View findViewWithTagTraversal(java.lang.Object);
    public void findViewsWithText(java.util.ArrayList, java.lang.CharSequence, int);
    protected boolean fitSystemWindows(android.graphics.Rect);
    public boolean fitsSystemWindows();
    public android.view.View focusSearch(int);
    public void forceHasOverlappingRendering(boolean);
    public void forceLayout();
    public boolean gatherTransparentRegion(android.graphics.Region);
    public static int generateViewId();
    public java.lang.CharSequence getAccessibilityClassName();
    public android.view.View$AccessibilityDelegate getAccessibilityDelegate();
    public int getAccessibilityLiveRegion();
    public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
    public java.lang.CharSequence getAccessibilityPaneTitle();
    public int getAccessibilitySelectionEnd();
    public int getAccessibilitySelectionStart();
    public int getAccessibilityTraversalAfter();
    public int getAccessibilityTraversalBefore();
    public int getAccessibilityViewId();
    public int getAccessibilityWindowId();
    public float getAlpha();
    public android.view.animation.Animation getAnimation();
    public android.os.IBinder getApplicationWindowToken();
    public java.lang.String[] getAutofillHints();
    public android.view.autofill.AutofillId getAutofillId();
    public int getAutofillType();
    public android.view.autofill.AutofillValue getAutofillValue();
    public int getAutofillViewId();
    public android.graphics.drawable.Drawable getBackground();
    public android.content.res.ColorStateList getBackgroundTintList();
    public android.graphics.PorterDuff$Mode getBackgroundTintMode();
    public int getBaseline();
    public int getBottom();
    protected float getBottomFadingEdgeStrength();
    protected int getBottomPaddingOffset();
    public void getBoundsOnScreen(android.graphics.Rect);
    public void getBoundsOnScreen(android.graphics.Rect, boolean);
    public float getCameraDistance();
    public android.graphics.Rect getClipBounds();
    public boolean getClipBounds(android.graphics.Rect);
    public boolean getClipToOutline();
    public java.lang.CharSequence getContentDescription();
    public android.content.Context getContext();
    protected android.view.ContextMenu$ContextMenuInfo getContextMenuInfo();
    public boolean getDefaultFocusHighlightEnabled();
    public static int getDefaultSize(int, int);
    public android.view.Display getDisplay();
    public int[] getDrawableState();
    public android.graphics.Bitmap getDrawingCache();
    public android.graphics.Bitmap getDrawingCache(boolean);
    public int getDrawingCacheBackgroundColor();
    public int getDrawingCacheQuality();
    public void getDrawingRect(android.graphics.Rect);
    public long getDrawingTime();
    public float getElevation();
    protected int getFadeHeight(boolean);
    protected int getFadeTop(boolean);
    public boolean getFilterTouchesWhenObscured();
    public boolean getFitsSystemWindows();
    public int getFocusable();
    public java.util.ArrayList getFocusables(int);
    public void getFocusedRect(android.graphics.Rect);
    public android.graphics.drawable.Drawable getForeground();
    public int getForegroundGravity();
    public android.content.res.ColorStateList getForegroundTintList();
    public android.graphics.PorterDuff$Mode getForegroundTintMode();
    public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
    public boolean getGlobalVisibleRect(android.graphics.Rect);
    public android.os.Handler getHandler();
    public boolean getHasOverlappingRendering();
    public int getHeight();
    public void getHitRect(android.graphics.Rect);
    public int getHorizontalFadingEdgeLength();
    protected float getHorizontalScrollFactor();
    protected int getHorizontalScrollbarHeight();
    public void getHotspotBounds(android.graphics.Rect);
    public int getId();
    public int getImportantForAccessibility();
    public int getImportantForAutofill();
    public android.graphics.Matrix getInverseMatrix();
    public java.lang.CharSequence getIterableTextForAccessibility();
    public android.view.AccessibilityIterators$TextSegmentIterator getIteratorForGranularity(int);
    public boolean getKeepScreenOn();
    public android.view.KeyEvent$DispatcherState getKeyDispatcherState();
    public int getLabelFor();
    public int getLayerType();
    public int getLayoutDirection();
    public android.view.ViewGroup$LayoutParams getLayoutParams();
    public int getLeft();
    protected float getLeftFadingEdgeStrength();
    protected int getLeftPaddingOffset();
    public boolean getLocalVisibleRect(android.graphics.Rect);
    public void getLocationInSurface(int[]);
    public void getLocationInWindow(int[]);
    public int[] getLocationOnScreen();
    public void getLocationOnScreen(int[]);
    public android.graphics.Matrix getMatrix();
    public int getMeasuredHeight();
    public int getMeasuredHeightAndState();
    public int getMeasuredState();
    public int getMeasuredWidth();
    public int getMeasuredWidthAndState();
    public int getMinimumHeight();
    public int getMinimumWidth();
    public int getNextClusterForwardId();
    public int getNextFocusDownId();
    public int getNextFocusForwardId();
    public int getNextFocusLeftId();
    public int getNextFocusRightId();
    public int getNextFocusUpId();
    public android.view.View$OnFocusChangeListener getOnFocusChangeListener();
    public android.graphics.Insets getOpticalInsets();
    public int getOutlineAmbientShadowColor();
    public android.view.ViewOutlineProvider getOutlineProvider();
    public int getOutlineSpotShadowColor();
    public void getOutsets(android.graphics.Rect);
    public int getOverScrollMode();
    public android.view.ViewOverlay getOverlay();
    public int getPaddingBottom();
    public int getPaddingEnd();
    public int getPaddingLeft();
    public int getPaddingRight();
    public int getPaddingStart();
    public int getPaddingTop();
    public android.view.ViewParent getParent();
    public android.view.ViewParent getParentForAccessibility();
    public float getPivotX();
    public float getPivotY();
    public android.view.PointerIcon getPointerIcon();
    public int getRawLayoutDirection();
    public int getRawTextAlignment();
    public int getRawTextDirection();
    public android.content.res.Resources getResources();
    public boolean getRevealOnFocusHint();
    public int getRight();
    protected float getRightFadingEdgeStrength();
    protected int getRightPaddingOffset();
    public android.view.View getRootView();
    public android.view.WindowInsets getRootWindowInsets();
    public float getRotation();
    public float getRotationX();
    public float getRotationY();
    public float getScaleX();
    public float getScaleY();
    public int getScrollBarDefaultDelayBeforeFade();
    public int getScrollBarFadeDuration();
    public int getScrollBarSize();
    public int getScrollBarStyle();
    public int getScrollIndicators();
    public int getScrollX();
    public int getScrollY();
    public int getSolidColor();
    public android.animation.StateListAnimator getStateListAnimator();
    protected int getSuggestedMinimumHeight();
    protected int getSuggestedMinimumWidth();
    public int getSystemUiVisibility();
    public java.lang.Object getTag();
    public java.lang.Object getTag(int);
    public int getTextAlignment();
    public int getTextDirection();
    public android.view.ThreadedRenderer getThreadedRenderer();
    public java.lang.CharSequence getTooltip();
    public java.lang.CharSequence getTooltipText();
    public android.view.View getTooltipView();
    public int getTop();
    protected float getTopFadingEdgeStrength();
    protected int getTopPaddingOffset();
    public android.view.TouchDelegate getTouchDelegate();
    public java.util.ArrayList getTouchables();
    public float getTransitionAlpha();
    public java.lang.String getTransitionName();
    public float getTranslationX();
    public float getTranslationY();
    public float getTranslationZ();
    public int getVerticalFadingEdgeLength();
    protected float getVerticalScrollFactor();
    public int getVerticalScrollbarPosition();
    public int getVerticalScrollbarWidth();
    public android.view.ViewRootImpl getViewRootImpl();
    public android.view.ViewTreeObserver getViewTreeObserver();
    public int getVisibility();
    public int getWidth();
    protected android.view.IWindow getWindow();
    protected int getWindowAttachCount();
    public void getWindowDisplayFrame(android.graphics.Rect);
    public android.view.WindowId getWindowId();
    public int getWindowSystemUiVisibility();
    public android.os.IBinder getWindowToken();
    public int getWindowVisibility();
    public void getWindowVisibleDisplayFrame(android.graphics.Rect);
    public float getX();
    public float getY();
    public float getZ();
    protected boolean handleScrollBarDragging(android.view.MotionEvent);
    public boolean hasExplicitFocusable();
    public boolean hasFocus();
    public boolean hasFocusable();
    protected boolean hasHoveredChild();
    public boolean hasNestedScrollingParent();
    public boolean hasOnClickListeners();
    protected boolean hasOpaqueScrollbars();
    public boolean hasOverlappingRendering();
    public boolean hasPointerCapture();
    public boolean hasShadow();
    public boolean hasTransientState();
    public boolean hasWindowFocus();
    public boolean includeForAccessibility();
    public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup);
    protected void initializeFadingEdge(android.content.res.TypedArray);
    protected void initializeFadingEdgeInternal(android.content.res.TypedArray);
    protected void initializeScrollbars(android.content.res.TypedArray);
    protected void initializeScrollbarsInternal(android.content.res.TypedArray);
    protected void internalSetPadding(int, int, int, int);
    public void invalidate(android.graphics.Rect);
    public void invalidate(int, int, int, int);
    public void invalidate();
    public void invalidate(boolean);
    public void invalidateDrawable(android.graphics.drawable.Drawable);
    public void invalidateOutline();
    protected void invalidateParentCaches();
    protected void invalidateParentIfNeeded();
    protected void invalidateParentIfNeededAndWasQuickRejected();
    public boolean isAccessibilityFocused();
    public boolean isAccessibilityHeading();
    public boolean isAccessibilitySelectionExtendable();
    public boolean isActionableForAccessibility();
    public boolean isActivated();
    public boolean isAssistBlocked();
    public boolean isAttachedToWindow();
    public boolean isAutofilled();
    public boolean isClickable();
    public boolean isContextClickable();
    public static boolean isDefaultFocusHighlightEnabled();
    public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
    public boolean isDirty();
    public boolean isDrawingCacheEnabled();
    public boolean isDuplicateParentStateEnabled();
    public boolean isEnabled();
    public boolean isFocusable();
    public boolean isFocusableInTouchMode();
    public boolean isFocused();
    public boolean isFocusedByDefault();
    public boolean isForegroundInsidePadding();
    public boolean isHapticFeedbackEnabled();
    public boolean isHardwareAccelerated();
    public boolean isHorizontalFadingEdgeEnabled();
    public boolean isHorizontalScrollBarEnabled();
    public boolean isHovered();
    public boolean isImportantForAccessibility();
    public boolean isImportantForAutofill();
    public boolean isInEditMode();
    public boolean isInLayout();
    public boolean isInScrollingContainer();
    public boolean isInTouchMode();
    public boolean isKeyboardNavigationCluster();
    public boolean isLaidOut();
    public boolean isLayoutDirectionInherited();
    public boolean isLayoutDirectionResolved();
    public static boolean isLayoutModeOptical(java.lang.Object);
    public boolean isLayoutRequested();
    public boolean isLayoutRtl();
    public boolean isLongClickable();
    public boolean isNestedScrollingEnabled();
    public boolean isOpaque();
    protected boolean isPaddingOffsetRequired();
    public boolean isPaddingRelative();
    public boolean isPivotSet();
    public boolean isPressed();
    public boolean isRootNamespace();
    public boolean isSaveEnabled();
    public boolean isSaveFromParentEnabled();
    public boolean isScreenReaderFocusable();
    public boolean isScrollContainer();
    public boolean isScrollbarFadingEnabled();
    public boolean isSelected();
    public boolean isShown();
    public boolean isSoundEffectsEnabled();
    public boolean isTemporarilyDetached();
    public boolean isTextAlignmentInherited();
    public boolean isTextAlignmentResolved();
    public boolean isTextDirectionInherited();
    public boolean isTextDirectionResolved();
    public boolean isVerticalFadingEdgeEnabled();
    public boolean isVerticalScrollBarEnabled();
    protected boolean isVerticalScrollBarHidden();
    public boolean isVisibleToUser();
    protected boolean isVisibleToUser(android.graphics.Rect);
    public boolean isVisibleToUserForAutofill(int);
    public void jumpDrawablesToCurrentState();
    public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
    public void layout(int, int, int, int);
    public void makeOptionalFitsSystemWindows();
    public void mapRectFromViewToScreenCoords(android.graphics.RectF, boolean);
    public void measure(int, int);
    protected static int[] mergeDrawableStates(int[], int[]);
    public void notifyEnterOrExitForAutoFillIfNeeded(boolean);
    public void notifySubtreeAccessibilityStateChangedIfNeeded();
    public void notifyViewAccessibilityStateChangedIfNeeded(int);
    public void offsetLeftAndRight(int);
    public void offsetTopAndBottom(int);
    public void onActivityResult(int, int, android.content.Intent);
    protected void onAnimationEnd();
    protected void onAnimationStart();
    public android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets);
    protected void onAttachedToWindow();
    public void onCancelPendingInputEvents();
    public boolean onCapturedPointerEvent(android.view.MotionEvent);
    public boolean onCheckIsTextEditor();
    public void onCloseSystemDialogs(java.lang.String);
    protected void onConfigurationChanged(android.content.res.Configuration);
    protected void onCreateContextMenu(android.view.ContextMenu);
    protected int[] onCreateDrawableState(int);
    public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
    protected void onDetachedFromWindow();
    protected void onDetachedFromWindowInternal();
    protected void onDisplayHint(int);
    public boolean onDragEvent(android.view.DragEvent);
    protected void onDraw(android.graphics.Canvas);
    public void onDrawForeground(android.graphics.Canvas);
    protected void onDrawHorizontalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
    protected void onDrawScrollBars(android.graphics.Canvas);
    protected void onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
    public boolean onFilterTouchEventForSecurity(android.view.MotionEvent);
    protected void onFinishInflate();
    public void onFinishTemporaryDetach();
    protected void onFocusChanged(boolean, int, android.graphics.Rect);
    protected void onFocusLost();
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public void onHoverChanged(boolean);
    public boolean onHoverEvent(android.view.MotionEvent);
    public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    public boolean onKeyDown(int, android.view.KeyEvent);
    public boolean onKeyLongPress(int, android.view.KeyEvent);
    public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    public boolean onKeyPreIme(int, android.view.KeyEvent);
    public boolean onKeyShortcut(int, android.view.KeyEvent);
    public boolean onKeyUp(int, android.view.KeyEvent);
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public void onMovedToDisplay(int, android.content.res.Configuration);
    protected void onOverScrolled(int, int, boolean, boolean);
    public void onPointerCaptureChange(boolean);
    public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public void onPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onProvideAutofillStructure(android.view.ViewStructure, int);
    public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
    public void onProvideStructure(android.view.ViewStructure);
    public void onProvideVirtualStructure(android.view.ViewStructure);
    public void onResolveDrawables(int);
    public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
    protected void onRestoreInstanceState(android.os.Parcelable);
    public void onRtlPropertiesChanged(int);
    protected android.os.Parcelable onSaveInstanceState();
    public void onScreenStateChanged(int);
    protected void onScrollChanged(int, int, int, int);
    protected boolean onSetAlpha(int);
    protected void onSizeChanged(int, int, int, int);
    public void onStartTemporaryDetach();
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean onTrackballEvent(android.view.MotionEvent);
    public void onVisibilityAggregated(boolean);
    protected void onVisibilityChanged(android.view.View, int);
    public void onWindowFocusChanged(boolean);
    public void onWindowSystemUiVisibilityChanged(int);
    protected void onWindowVisibilityChanged(int);
    public void outputDirtyFlags(java.lang.String, boolean, int);
    protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean);
    public boolean performAccessibilityAction(int, android.os.Bundle);
    public boolean performAccessibilityActionInternal(int, android.os.Bundle);
    protected boolean performButtonActionOnTouchDown(android.view.MotionEvent);
    public boolean performClick();
    public boolean performContextClick(float, float);
    public boolean performContextClick();
    public boolean performHapticFeedback(int);
    public boolean performHapticFeedback(int, int);
    public boolean performLongClick();
    public boolean performLongClick(float, float);
    public void playSoundEffect(int);
    public boolean pointInView(float, float, float);
    public boolean post(java.lang.Runnable);
    public boolean postDelayed(java.lang.Runnable, long);
    public void postInvalidate();
    public void postInvalidate(int, int, int, int);
    public void postInvalidateDelayed(long);
    public void postInvalidateDelayed(long, int, int, int, int);
    public void postInvalidateOnAnimation();
    public void postInvalidateOnAnimation(int, int, int, int);
    public void postOnAnimation(java.lang.Runnable);
    public void postOnAnimationDelayed(java.lang.Runnable, long);
    protected void recomputePadding();
    public void refreshDrawableState();
    public void releasePointerCapture();
    public boolean removeCallbacks(java.lang.Runnable);
    public void removeFrameMetricsListener(android.view.Window$OnFrameMetricsAvailableListener);
    public void removeOnAttachStateChangeListener(android.view.View$OnAttachStateChangeListener);
    public void removeOnLayoutChangeListener(android.view.View$OnLayoutChangeListener);
    public void removeOnUnhandledKeyEventListener(android.view.View$OnUnhandledKeyEventListener);
    public boolean requestAccessibilityFocus();
    public void requestApplyInsets();
    public void requestFitSystemWindows();
    public boolean requestFocus();
    public boolean requestFocus(int);
    public boolean requestFocus(int, android.graphics.Rect);
    public boolean requestFocusFromTouch();
    public void requestKeyboardShortcuts(java.util.List, int);
    public void requestLayout();
    public void requestPointerCapture();
    public boolean requestRectangleOnScreen(android.graphics.Rect);
    public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
    public void requestUnbufferedDispatch(android.view.MotionEvent);
    public android.view.View requireViewById(int);
    public void resetPaddingToInitialValues();
    public void resetPivot();
    protected void resetResolvedDrawables();
    public void resetResolvedLayoutDirection();
    public void resetResolvedPadding();
    public void resetResolvedTextAlignment();
    public void resetResolvedTextDirection();
    public void resetRtlProperties();
    protected void resolveDrawables();
    public boolean resolveLayoutDirection();
    public void resolveLayoutParams();
    public void resolvePadding();
    public boolean resolveRtlPropertiesIfNeeded();
    public static int resolveSize(int, int);
    public static int resolveSizeAndState(int, int, int);
    public boolean resolveTextAlignment();
    public boolean resolveTextDirection();
    public boolean restoreDefaultFocus();
    public boolean restoreFocusInCluster(int);
    public boolean restoreFocusNotInCluster();
    public void restoreHierarchyState(android.util.SparseArray);
    public void saveHierarchyState(android.util.SparseArray);
    public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
    public void scrollBy(int, int);
    public void scrollTo(int, int);
    public void sendAccessibilityEvent(int);
    public void sendAccessibilityEventInternal(int);
    public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
    public void sendAccessibilityEventUncheckedInternal(android.view.accessibility.AccessibilityEvent);
    public void setAccessibilityDelegate(android.view.View$AccessibilityDelegate);
    public void setAccessibilityHeading(boolean);
    public void setAccessibilityLiveRegion(int);
    public void setAccessibilityPaneTitle(java.lang.CharSequence);
    public void setAccessibilitySelection(int, int);
    public void setAccessibilityTraversalAfter(int);
    public void setAccessibilityTraversalBefore(int);
    public void setActivated(boolean);
    public void setAlpha(float);
    public void setAnimation(android.view.animation.Animation);
    public void setAnimationMatrix(android.graphics.Matrix);
    public void setAssistBlocked(boolean);
    public void setAutofillHints(java.lang.String[]);
    public void setAutofillId(android.view.autofill.AutofillId);
    public void setAutofilled(boolean);
    public void setBackground(android.graphics.drawable.Drawable);
    public void setBackgroundColor(int);
    public void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public void setBackgroundResource(int);
    public void setBackgroundTintList(android.content.res.ColorStateList);
    public void setBackgroundTintMode(android.graphics.PorterDuff$Mode);
    public void setBottom(int);
    public void setCameraDistance(float);
    public void setClickable(boolean);
    public void setClipBounds(android.graphics.Rect);
    public void setClipToOutline(boolean);
    public void setContentDescription(java.lang.CharSequence);
    public void setContextClickable(boolean);
    public void setDefaultFocusHighlightEnabled(boolean);
    public void setDisabledSystemUiVisibility(int);
    public void setDrawingCacheBackgroundColor(int);
    public void setDrawingCacheEnabled(boolean);
    public void setDrawingCacheQuality(int);
    public void setDuplicateParentStateEnabled(boolean);
    public void setElevation(float);
    public void setEnabled(boolean);
    public void setFadingEdgeLength(int);
    public void setFilterTouchesWhenObscured(boolean);
    public void setFitsSystemWindows(boolean);
    public void setFocusable(boolean);
    public void setFocusable(int);
    public void setFocusableInTouchMode(boolean);
    public void setFocusedByDefault(boolean);
    public void setFocusedInCluster();
    public void setForeground(android.graphics.drawable.Drawable);
    public void setForegroundGravity(int);
    public void setForegroundTintList(android.content.res.ColorStateList);
    public void setForegroundTintMode(android.graphics.PorterDuff$Mode);
    protected boolean setFrame(int, int, int, int);
    public void setHapticFeedbackEnabled(boolean);
    public void setHasTransientState(boolean);
    public void setHorizontalFadingEdgeEnabled(boolean);
    public void setHorizontalScrollBarEnabled(boolean);
    public void setHovered(boolean);
    public void setId(int);
    public void setImportantForAccessibility(int);
    public void setImportantForAutofill(int);
    public void setIsRootNamespace(boolean);
    public void setKeepScreenOn(boolean);
    public void setKeyboardNavigationCluster(boolean);
    public void setLabelFor(int);
    public void setLayerPaint(android.graphics.Paint);
    public void setLayerType(int, android.graphics.Paint);
    public void setLayoutDirection(int);
    public void setLayoutParams(android.view.ViewGroup$LayoutParams);
    public void setLeft(int);
    public void setLeftTopRightBottom(int, int, int, int);
    public void setLongClickable(boolean);
    protected void setMeasuredDimension(int, int);
    public void setMinimumHeight(int);
    public void setMinimumWidth(int);
    public void setNestedScrollingEnabled(boolean);
    public void setNextClusterForwardId(int);
    public void setNextFocusDownId(int);
    public void setNextFocusForwardId(int);
    public void setNextFocusLeftId(int);
    public void setNextFocusRightId(int);
    public void setNextFocusUpId(int);
    public void setNotifyAutofillManagerOnClick(boolean);
    public void setOnApplyWindowInsetsListener(android.view.View$OnApplyWindowInsetsListener);
    public void setOnCapturedPointerListener(android.view.View$OnCapturedPointerListener);
    public void setOnClickListener(android.view.View$OnClickListener);
    public void setOnContextClickListener(android.view.View$OnContextClickListener);
    public void setOnCreateContextMenuListener(android.view.View$OnCreateContextMenuListener);
    public void setOnDragListener(android.view.View$OnDragListener);
    public void setOnFocusChangeListener(android.view.View$OnFocusChangeListener);
    public void setOnGenericMotionListener(android.view.View$OnGenericMotionListener);
    public void setOnHoverListener(android.view.View$OnHoverListener);
    public void setOnKeyListener(android.view.View$OnKeyListener);
    public void setOnLongClickListener(android.view.View$OnLongClickListener);
    public void setOnScrollChangeListener(android.view.View$OnScrollChangeListener);
    public void setOnSystemUiVisibilityChangeListener(android.view.View$OnSystemUiVisibilityChangeListener);
    public void setOnTouchListener(android.view.View$OnTouchListener);
    public void setOpticalInsets(android.graphics.Insets);
    public void setOutlineAmbientShadowColor(int);
    public void setOutlineProvider(android.view.ViewOutlineProvider);
    public void setOutlineSpotShadowColor(int);
    public void setOverScrollMode(int);
    public void setPadding(int, int, int, int);
    public void setPaddingRelative(int, int, int, int);
    public void setPivotX(float);
    public void setPivotY(float);
    public void setPointerIcon(android.view.PointerIcon);
    public void setPressed(boolean);
    public void setRevealClip(boolean, float, float, float);
    public void setRevealOnFocusHint(boolean);
    public void setRight(int);
    public void setRotation(float);
    public void setRotationX(float);
    public void setRotationY(float);
    public void setSaveEnabled(boolean);
    public void setSaveFromParentEnabled(boolean);
    public void setScaleX(float);
    public void setScaleY(float);
    public void setScreenReaderFocusable(boolean);
    public void setScrollBarDefaultDelayBeforeFade(int);
    public void setScrollBarFadeDuration(int);
    public void setScrollBarSize(int);
    public void setScrollBarStyle(int);
    public void setScrollContainer(boolean);
    public void setScrollIndicators(int);
    public void setScrollIndicators(int, int);
    public void setScrollX(int);
    public void setScrollY(int);
    public void setScrollbarFadingEnabled(boolean);
    public void setSelected(boolean);
    public void setSoundEffectsEnabled(boolean);
    public void setStateListAnimator(android.animation.StateListAnimator);
    public void setSystemUiVisibility(int);
    public void setTag(java.lang.Object);
    public void setTag(int, java.lang.Object);
    public void setTagInternal(int, java.lang.Object);
    public void setTextAlignment(int);
    public void setTextDirection(int);
    public void setTooltip(java.lang.CharSequence);
    public void setTooltipText(java.lang.CharSequence);
    public void setTop(int);
    public void setTouchDelegate(android.view.TouchDelegate);
    public void setTransitionAlpha(float);
    public void setTransitionName(java.lang.String);
    public void setTransitionVisibility(int);
    public void setTranslationX(float);
    public void setTranslationY(float);
    public void setTranslationZ(float);
    public void setVerticalFadingEdgeEnabled(boolean);
    public void setVerticalScrollBarEnabled(boolean);
    public void setVerticalScrollbarPosition(int);
    public void setVisibility(int);
    public void setWillNotCacheDrawing(boolean);
    public void setWillNotDraw(boolean);
    public void setX(float);
    public void setY(float);
    public void setZ(float);
    public boolean showContextMenu();
    public boolean showContextMenu(float, float);
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
    public android.view.ActionMode startActionMode(android.view.ActionMode$Callback, int);
    public void startActivityForResult(android.content.Intent, int);
    public void startAnimation(android.view.animation.Animation);
    public boolean startDrag(android.content.ClipData, android.view.View$DragShadowBuilder, java.lang.Object, int);
    public boolean startDragAndDrop(android.content.ClipData, android.view.View$DragShadowBuilder, java.lang.Object, int);
    public boolean startMovingTask(float, float);
    public boolean startNestedScroll(int);
    public void stopNestedScroll();
    public boolean toGlobalMotionEvent(android.view.MotionEvent);
    public boolean toLocalMotionEvent(android.view.MotionEvent);
    public java.lang.String toString();
    public void transformFromViewToWindowSpace(int[]);
    public void transformMatrixToGlobal(android.graphics.Matrix);
    public void transformMatrixToLocal(android.graphics.Matrix);
    public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
    public void unscheduleDrawable(android.graphics.drawable.Drawable);
    public android.view.RenderNode updateDisplayListIfDirty();
    public void updateDragShadow(android.view.View$DragShadowBuilder);
    protected boolean verifyDrawable(android.graphics.drawable.Drawable);
    public boolean willNotCacheDrawing();
    public boolean willNotDraw();


    public static int ACCESSIBILITY_CURSOR_POSITION_UNDEFINED;
    public static int ACCESSIBILITY_LIVE_REGION_ASSERTIVE;
    public static int ACCESSIBILITY_LIVE_REGION_NONE;
    public static int ACCESSIBILITY_LIVE_REGION_POLITE;
    public static android.util.Property ALPHA;
    public static int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_NUMBER;
    public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE;
    public static java.lang.String AUTOFILL_HINT_EMAIL_ADDRESS;
    public static java.lang.String AUTOFILL_HINT_NAME;
    public static java.lang.String AUTOFILL_HINT_PASSWORD;
    public static java.lang.String AUTOFILL_HINT_PHONE;
    public static java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS;
    public static java.lang.String AUTOFILL_HINT_POSTAL_CODE;
    public static java.lang.String AUTOFILL_HINT_USERNAME;
    public static int AUTOFILL_TYPE_DATE;
    public static int AUTOFILL_TYPE_LIST;
    public static int AUTOFILL_TYPE_NONE;
    public static int AUTOFILL_TYPE_TEXT;
    public static int AUTOFILL_TYPE_TOGGLE;
    public static boolean DEBUG_DRAW;
    public static java.lang.String DEBUG_LAYOUT_PROPERTY;
    public static int DRAG_FLAG_GLOBAL;
    public static int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION;
    public static int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION;
    public static int DRAG_FLAG_GLOBAL_URI_READ;
    public static int DRAG_FLAG_GLOBAL_URI_WRITE;
    public static int DRAG_FLAG_OPAQUE;
    public static int DRAWING_CACHE_QUALITY_AUTO;
    public static int DRAWING_CACHE_QUALITY_HIGH;
    public static int DRAWING_CACHE_QUALITY_LOW;
    protected static int[] EMPTY_STATE_SET;
    protected static int[] ENABLED_FOCUSED_SELECTED_STATE_SET;
    protected static int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] ENABLED_FOCUSED_STATE_SET;
    protected static int[] ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] ENABLED_SELECTED_STATE_SET;
    protected static int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] ENABLED_STATE_SET;
    protected static int[] ENABLED_WINDOW_FOCUSED_STATE_SET;
    public static int FIND_VIEWS_WITH_ACCESSIBILITY_NODE_PROVIDERS;
    public static int FIND_VIEWS_WITH_CONTENT_DESCRIPTION;
    public static int FIND_VIEWS_WITH_TEXT;
    public static int FOCUSABLE;
    public static int FOCUSABLES_ALL;
    public static int FOCUSABLES_TOUCH_MODE;
    public static int FOCUSABLE_AUTO;
    protected static int[] FOCUSED_SELECTED_STATE_SET;
    protected static int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] FOCUSED_STATE_SET;
    protected static int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
    public static int FOCUS_BACKWARD;
    public static int FOCUS_DOWN;
    public static int FOCUS_FORWARD;
    public static int FOCUS_LEFT;
    public static int FOCUS_RIGHT;
    public static int FOCUS_UP;
    public static int GONE;
    public static int HAPTIC_FEEDBACK_ENABLED;
    public static int IMPORTANT_FOR_ACCESSIBILITY_AUTO;
    public static int IMPORTANT_FOR_ACCESSIBILITY_NO;
    public static int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
    public static int IMPORTANT_FOR_ACCESSIBILITY_YES;
    public static int IMPORTANT_FOR_AUTOFILL_AUTO;
    public static int IMPORTANT_FOR_AUTOFILL_NO;
    public static int IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS;
    public static int IMPORTANT_FOR_AUTOFILL_YES;
    public static int IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS;
    public static int INVISIBLE;
    public static int KEEP_SCREEN_ON;
    public static int LAST_APP_AUTOFILL_ID;
    public static int LAYER_TYPE_HARDWARE;
    public static int LAYER_TYPE_NONE;
    public static int LAYER_TYPE_SOFTWARE;
    public static int LAYOUT_DIRECTION_INHERIT;
    public static int LAYOUT_DIRECTION_LOCALE;
    public static int LAYOUT_DIRECTION_LTR;
    public static int LAYOUT_DIRECTION_RTL;
    public static int LAYOUT_DIRECTION_UNDEFINED;
    public static int MEASURED_HEIGHT_STATE_SHIFT;
    public static int MEASURED_SIZE_MASK;
    public static int MEASURED_STATE_MASK;
    public static int MEASURED_STATE_TOO_SMALL;
    public static int NAVIGATION_BAR_TRANSIENT;
    public static int NAVIGATION_BAR_TRANSLUCENT;
    public static int NAVIGATION_BAR_TRANSPARENT;
    public static int NAVIGATION_BAR_UNHIDE;
    public static int NOT_FOCUSABLE;
    public static int NO_ID;
    public static int OVER_SCROLL_ALWAYS;
    public static int OVER_SCROLL_IF_CONTENT_SCROLLS;
    public static int OVER_SCROLL_NEVER;
    protected static int[] PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET;
    protected static int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_SELECTED_STATE_SET;
    protected static int[] PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_ENABLED_STATE_SET;
    protected static int[] PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_SELECTED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_STATE_SET;
    protected static int[] PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_SELECTED_STATE_SET;
    protected static int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    protected static int[] PRESSED_STATE_SET;
    protected static int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
    public static int PUBLIC_STATUS_BAR_VISIBILITY_MASK;
    public static android.util.Property ROTATION;
    public static android.util.Property ROTATION_X;
    public static android.util.Property ROTATION_Y;
    public static android.util.Property SCALE_X;
    public static android.util.Property SCALE_Y;
    public static int SCREEN_STATE_OFF;
    public static int SCREEN_STATE_ON;
    public static int SCROLLBARS_INSIDE_INSET;
    public static int SCROLLBARS_INSIDE_OVERLAY;
    public static int SCROLLBARS_OUTSIDE_INSET;
    public static int SCROLLBARS_OUTSIDE_OVERLAY;
    public static int SCROLLBAR_POSITION_DEFAULT;
    public static int SCROLLBAR_POSITION_LEFT;
    public static int SCROLLBAR_POSITION_RIGHT;
    public static int SCROLL_AXIS_HORIZONTAL;
    public static int SCROLL_AXIS_NONE;
    public static int SCROLL_AXIS_VERTICAL;
    public static int SCROLL_INDICATOR_BOTTOM;
    public static int SCROLL_INDICATOR_END;
    public static int SCROLL_INDICATOR_LEFT;
    public static int SCROLL_INDICATOR_RIGHT;
    public static int SCROLL_INDICATOR_START;
    public static int SCROLL_INDICATOR_TOP;
    protected static int[] SELECTED_STATE_SET;
    protected static int[] SELECTED_WINDOW_FOCUSED_STATE_SET;
    public static int SOUND_EFFECTS_ENABLED;
    public static int STATUS_BAR_DISABLE_BACK;
    public static int STATUS_BAR_DISABLE_CLOCK;
    public static int STATUS_BAR_DISABLE_EXPAND;
    public static int STATUS_BAR_DISABLE_HOME;
    public static int STATUS_BAR_DISABLE_NOTIFICATION_ALERTS;
    public static int STATUS_BAR_DISABLE_NOTIFICATION_ICONS;
    public static int STATUS_BAR_DISABLE_NOTIFICATION_TICKER;
    public static int STATUS_BAR_DISABLE_RECENT;
    public static int STATUS_BAR_DISABLE_SEARCH;
    public static int STATUS_BAR_DISABLE_SYSTEM_INFO;
    public static int STATUS_BAR_HIDDEN;
    public static int STATUS_BAR_TRANSIENT;
    public static int STATUS_BAR_TRANSLUCENT;
    public static int STATUS_BAR_TRANSPARENT;
    public static int STATUS_BAR_UNHIDE;
    public static int STATUS_BAR_VISIBLE;
    public static int SYSTEM_UI_CLEARABLE_FLAGS;
    public static int SYSTEM_UI_FLAG_FULLSCREEN;
    public static int SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    public static int SYSTEM_UI_FLAG_IMMERSIVE;
    public static int SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    public static int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    public static int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    public static int SYSTEM_UI_FLAG_LAYOUT_STABLE;
    public static int SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
    public static int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
    public static int SYSTEM_UI_FLAG_LOW_PROFILE;
    public static int SYSTEM_UI_FLAG_VISIBLE;
    public static int SYSTEM_UI_LAYOUT_FLAGS;
    public static int SYSTEM_UI_TRANSPARENT;
    public static int TEXT_ALIGNMENT_CENTER;
    public static int TEXT_ALIGNMENT_GRAVITY;
    public static int TEXT_ALIGNMENT_INHERIT;
    public static int TEXT_ALIGNMENT_TEXT_END;
    public static int TEXT_ALIGNMENT_TEXT_START;
    public static int TEXT_ALIGNMENT_VIEW_END;
    public static int TEXT_ALIGNMENT_VIEW_START;
    public static int TEXT_DIRECTION_ANY_RTL;
    public static int TEXT_DIRECTION_FIRST_STRONG;
    public static int TEXT_DIRECTION_FIRST_STRONG_LTR;
    public static int TEXT_DIRECTION_FIRST_STRONG_RTL;
    public static int TEXT_DIRECTION_INHERIT;
    public static int TEXT_DIRECTION_LOCALE;
    public static int TEXT_DIRECTION_LTR;
    public static int TEXT_DIRECTION_RTL;
    public static android.util.Property TRANSLATION_X;
    public static android.util.Property TRANSLATION_Y;
    public static android.util.Property TRANSLATION_Z;
    protected static java.lang.String VIEW_LOG_TAG;
    public static int VISIBLE;
    protected static int[] WINDOW_FOCUSED_STATE_SET;
    public static android.util.Property X;
    public static android.util.Property Y;
    public static android.util.Property Z;
    public java.lang.String[] mAttributes;
    protected int mBottom;
    public boolean mCachingFailed;
    protected android.content.Context mContext;
    protected android.view.animation.Animation mCurrentAnimation;
    public static boolean mDebugViewAttributes;
    protected android.view.InputEventConsistencyVerifier mInputEventConsistencyVerifier;
    protected android.view.ViewGroup$LayoutParams mLayoutParams;
    protected int mLeft;
    protected int mPaddingBottom;
    protected int mPaddingLeft;
    protected int mPaddingRight;
    protected int mPaddingTop;
    protected android.view.ViewParent mParent;
    public int mPrivateFlags;
    protected int mRight;
    protected int mScrollX;
    protected int mScrollY;
    protected java.lang.Object mTag;
    protected int mTop;
    public android.view.View$TransformationInfo mTransformationInfo;
    protected int mUserPaddingBottom;
    protected int mUserPaddingLeft;
    protected int mUserPaddingRight;
    protected static boolean sPreserveMarginParamsInLayoutParamConversion;
}

-keep class android.view.View$AccessibilityDelegate {
    <init>();

    public void addExtraDataToAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(android.view.View);
    public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(android.view.View);
    public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
    public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
    public void sendAccessibilityEvent(android.view.View, int);
    public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);


}

-keep class android.view.View$AttachInfo {



    public android.view.Surface mDragSurface;
}

-keep class android.view.View$AttachInfo$InvalidateInfo {

    public static android.view.View$AttachInfo$InvalidateInfo obtain();
    public void recycle();


}

-keep class android.view.View$DragShadowBuilder {
    <init>(android.view.View);
    <init>();

    public android.view.View getView();
    public void onDrawShadow(android.graphics.Canvas);
    public void onProvideShadowMetrics(android.graphics.Point, android.graphics.Point);


}

-keep class android.view.View$OnApplyWindowInsetsListener {

    public abstract android.view.WindowInsets onApplyWindowInsets(android.view.View, android.view.WindowInsets);


}

-keep class android.view.View$OnAttachStateChangeListener {

    public abstract void onViewAttachedToWindow(android.view.View);
    public abstract void onViewDetachedFromWindow(android.view.View);


}

-keep class android.view.View$OnCapturedPointerListener {

    public abstract boolean onCapturedPointer(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnClickListener {

    public abstract void onClick(android.view.View);


}

-keep class android.view.View$OnContextClickListener {

    public abstract boolean onContextClick(android.view.View);


}

-keep class android.view.View$OnCreateContextMenuListener {

    public abstract void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);


}

-keep class android.view.View$OnDragListener {

    public abstract boolean onDrag(android.view.View, android.view.DragEvent);


}

-keep class android.view.View$OnFocusChangeListener {

    public abstract void onFocusChange(android.view.View, boolean);


}

-keep class android.view.View$OnGenericMotionListener {

    public abstract boolean onGenericMotion(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnHoverListener {

    public abstract boolean onHover(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnKeyListener {

    public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);


}

-keep class android.view.View$OnLayoutChangeListener {

    public abstract void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);


}

-keep class android.view.View$OnLongClickListener {

    public abstract boolean onLongClick(android.view.View);


}

-keep class android.view.View$OnScrollChangeListener {

    public abstract void onScrollChange(android.view.View, int, int, int, int);


}

-keep class android.view.View$OnSystemUiVisibilityChangeListener {

    public abstract void onSystemUiVisibilityChange(int);


}

-keep class android.view.View$OnTouchListener {

    public abstract boolean onTouch(android.view.View, android.view.MotionEvent);


}

-keep class android.view.View$OnUnhandledKeyEventListener {

    public abstract boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);


}

-keep class android.view.View$TransformationInfo {



}

-keep class android.view.ViewDebug {
    <init>();

    public static void capture(android.view.View, java.io.OutputStream, android.view.View);
    public static void captureLayers(android.view.View, java.io.DataOutputStream);
    public static void dump(android.view.View, boolean, boolean, java.io.OutputStream);
    public static void dumpCapturedView(java.lang.String, java.lang.Object);
    public static void dumpTheme(android.view.View, java.io.OutputStream);
    public static void dumpv2(android.view.View, java.io.ByteArrayOutputStream);
    public static android.view.View findView(android.view.View, java.lang.String);
    public static java.lang.String flagsToString(java.lang.Class, java.lang.String, int);
    public static long getViewInstanceCount();
    public static long getViewRootImplCount();
    public static java.lang.String intToString(java.lang.Class, java.lang.String, int);
    public static java.lang.Object invokeViewMethod(android.view.View, java.lang.reflect.Method, java.lang.Object[]);
    public static void outputDisplayList(android.view.View, android.view.View);
    public static void profileViewAndChildren(android.view.View, java.io.BufferedWriter);
    public static void setLayoutParameter(android.view.View, java.lang.String, int);
    public static void startHierarchyTracing(java.lang.String, android.view.View);
    public static void startRecyclerTracing(java.lang.String, android.view.View);
    public static void stopHierarchyTracing();
    public static void stopRecyclerTracing();
    public static void trace(android.view.View, android.view.ViewDebug$RecyclerTraceType, int[]);
    public static void trace(android.view.View, android.view.ViewDebug$HierarchyTraceType);


    public static boolean DEBUG_DRAG;
    public static boolean DEBUG_POSITIONING;
    public static boolean TRACE_HIERARCHY;
    public static boolean TRACE_RECYCLER;
}

-keep class android.view.ViewDebug$CanvasProvider {

    public abstract android.graphics.Bitmap createBitmap();
    public abstract android.graphics.Canvas getCanvas(android.view.View, int, int);


}

-keep class android.view.ViewDebug$HierarchyTraceType {

    public static android.view.ViewDebug$HierarchyTraceType valueOf(java.lang.String);
    public static android.view.ViewDebug$HierarchyTraceType[] values();

    public static android.view.ViewDebug$HierarchyTraceType BUILD_CACHE;
    public static android.view.ViewDebug$HierarchyTraceType DRAW;
    public static android.view.ViewDebug$HierarchyTraceType INVALIDATE;
    public static android.view.ViewDebug$HierarchyTraceType INVALIDATE_CHILD;
    public static android.view.ViewDebug$HierarchyTraceType INVALIDATE_CHILD_IN_PARENT;
    public static android.view.ViewDebug$HierarchyTraceType ON_LAYOUT;
    public static android.view.ViewDebug$HierarchyTraceType ON_MEASURE;
    public static android.view.ViewDebug$HierarchyTraceType REQUEST_LAYOUT;

}

-keep class android.view.ViewDebug$RecyclerTraceType {

    public static android.view.ViewDebug$RecyclerTraceType valueOf(java.lang.String);
    public static android.view.ViewDebug$RecyclerTraceType[] values();

    public static android.view.ViewDebug$RecyclerTraceType BIND_VIEW;
    public static android.view.ViewDebug$RecyclerTraceType MOVE_FROM_ACTIVE_TO_SCRAP_HEAP;
    public static android.view.ViewDebug$RecyclerTraceType MOVE_TO_SCRAP_HEAP;
    public static android.view.ViewDebug$RecyclerTraceType NEW_VIEW;
    public static android.view.ViewDebug$RecyclerTraceType RECYCLE_FROM_ACTIVE_HEAP;
    public static android.view.ViewDebug$RecyclerTraceType RECYCLE_FROM_SCRAP_HEAP;

}

-keep class android.view.ViewGroup {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addChildrenForAccessibility(java.util.ArrayList);
    public void addFocusables(java.util.ArrayList, int, int);
    public void addKeyboardNavigationClusters(java.util.Collection, int);
    public boolean addStatesFromChildren();
    public void addTouchables(java.util.ArrayList);
    public void addTransientView(android.view.View, int);
    public void addView(android.view.View);
    public void addView(android.view.View, int);
    public void addView(android.view.View, int, int);
    public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
    protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup$LayoutParams);
    protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup$LayoutParams, boolean);
    protected void attachLayoutAnimationParameters(android.view.View, android.view.ViewGroup$LayoutParams, int, int);
    protected void attachViewToParent(android.view.View, int, android.view.ViewGroup$LayoutParams);
    public void bringChildToFront(android.view.View);
    public java.util.ArrayList buildTouchDispatchChildList();
    protected boolean canAnimate();
    public void captureTransitioningViews(java.util.List);
    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    public void childDrawableStateChanged(android.view.View);
    public void childHasTransientStateChanged(android.view.View, boolean);
    protected void cleanupLayoutState(android.view.View);
    public void clearChildFocus(android.view.View);
    public void clearDisappearingChildren();
    public void clearFocus();
    public android.graphics.Bitmap createSnapshot(android.view.ViewDebug$CanvasProvider, boolean);
    protected void debug(int);
    protected void destroyHardwareResources();
    protected void detachAllViewsFromParent();
    protected void detachViewFromParent(android.view.View);
    protected void detachViewFromParent(int);
    protected void detachViewsFromParent(int, int);
    public boolean dispatchActivityResult(java.lang.String, int, int, android.content.Intent);
    public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
    public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
    public void dispatchConfigurationChanged(android.content.res.Configuration);
    public void dispatchDisplayHint(int);
    public boolean dispatchDragEvent(android.view.DragEvent);
    protected void dispatchDraw(android.graphics.Canvas);
    public void dispatchDrawableHotspotChanged(float, float);
    public void dispatchFinishTemporaryDetach();
    protected void dispatchFreezeSelfOnly(android.util.SparseArray);
    protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
    protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
    protected void dispatchGetDisplayList();
    protected boolean dispatchHoverEvent(android.view.MotionEvent);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
    public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public void dispatchPointerCaptureChanged(boolean);
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
    public void dispatchProvideStructure(android.view.ViewStructure);
    protected void dispatchRestoreInstanceState(android.util.SparseArray);
    protected void dispatchSaveInstanceState(android.util.SparseArray);
    public void dispatchSetActivated(boolean);
    protected void dispatchSetPressed(boolean);
    public void dispatchSetSelected(boolean);
    public void dispatchStartTemporaryDetach();
    public void dispatchSystemUiVisibilityChanged(int);
    protected void dispatchThawSelfOnly(android.util.SparseArray);
    public boolean dispatchTouchEvent(android.view.MotionEvent);
    public boolean dispatchTrackballEvent(android.view.MotionEvent);
    public boolean dispatchUnhandledMove(android.view.View, int);
    protected void dispatchVisibilityChanged(android.view.View, int);
    public void dispatchWindowFocusChanged(boolean);
    public void dispatchWindowSystemUiVisiblityChanged(int);
    public void dispatchWindowVisibilityChanged(int);
    protected boolean drawChild(android.graphics.Canvas, android.view.View, long);
    protected void drawableStateChanged();
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public void endViewTransition(android.view.View);
    public android.view.View findFocus();
    public void findNamedViews(java.util.Map);
    public android.view.View findViewByAccessibilityIdTraversal(int);
    public android.view.View findViewByAutofillIdTraversal(int);
    protected android.view.View findViewByPredicateTraversal(java.util.function.Predicate, android.view.View);
    protected android.view.View findViewTraversal(int);
    protected android.view.View findViewWithTagTraversal(java.lang.Object);
    public void findViewsWithText(java.util.ArrayList, java.lang.CharSequence, int);
    public android.view.View focusSearch(android.view.View, int);
    public void focusableViewAvailable(android.view.View);
    public boolean gatherTransparentRegion(android.graphics.Region);
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public java.lang.CharSequence getAccessibilityClassName();
    public android.view.View getChildAt(int);
    public int getChildCount();
    protected int getChildDrawingOrder(int, int);
    public static int getChildMeasureSpec(int, int, int);
    protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation);
    public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point, boolean);
    public boolean getClipChildren();
    public boolean getClipToPadding();
    public int getDescendantFocusability();
    public android.view.View getFocusedChild();
    public android.view.animation.LayoutAnimationController getLayoutAnimation();
    public android.view.animation.Animation$AnimationListener getLayoutAnimationListener();
    public int getLayoutMode();
    public android.animation.LayoutTransition getLayoutTransition();
    public int getNestedScrollAxes();
    public android.view.ViewGroupOverlay getOverlay();
    public android.view.ViewOverlay getOverlay();
    public int getPersistentDrawingCache();
    public boolean getTouchscreenBlocksFocus();
    public android.view.View getTransientView(int);
    public int getTransientViewCount();
    public int getTransientViewIndex(int);
    public boolean hasFocus();
    protected boolean hasHoveredChild();
    public boolean hasTransientState();
    public int indexOfChild(android.view.View);
    protected void internalSetPadding(int, int, int, int);
    public void invalidateChild(android.view.View, android.graphics.Rect);
    public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    public boolean isAlwaysDrawnWithCacheEnabled();
    public boolean isAnimationCacheEnabled();
    protected boolean isChildrenDrawingOrderEnabled();
    protected boolean isChildrenDrawnWithCacheEnabled();
    public boolean isLayoutSuppressed();
    public boolean isMotionEventSplittingEnabled();
    public boolean isShowingContextMenuWithCoords();
    protected boolean isTransformedTouchPointInView(float, float, android.view.View, android.graphics.PointF);
    public boolean isTransitionGroup();
    public void jumpDrawablesToCurrentState();
    public void layout(int, int, int, int);
    public void makeOptionalFitsSystemWindows();
    protected void measureChild(android.view.View, int, int);
    protected void measureChildWithMargins(android.view.View, int, int, int, int);
    protected void measureChildren(int, int);
    public void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
    public void notifySubtreeAccessibilityStateChangedIfNeeded();
    public void offsetChildrenTopAndBottom(int);
    public void offsetDescendantRectToMyCoords(android.view.View, android.graphics.Rect);
    public void offsetRectIntoDescendantCoords(android.view.View, android.graphics.Rect);
    protected void onAttachedToWindow();
    protected void onChildVisibilityChanged(android.view.View, int, int);
    protected int[] onCreateDrawableState(int);
    protected void onDebugDraw(android.graphics.Canvas);
    protected void onDebugDrawMargins(android.graphics.Canvas, android.graphics.Paint);
    public void onDescendantInvalidated(android.view.View, android.view.View);
    protected void onDetachedFromWindow();
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    public boolean onInterceptHoverEvent(android.view.MotionEvent);
    public boolean onInterceptTouchEvent(android.view.MotionEvent);
    protected abstract void onLayout(boolean, int, int, int, int);
    public boolean onNestedFling(android.view.View, float, float, boolean);
    public boolean onNestedPreFling(android.view.View, float, float);
    public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
    public void onNestedPreScroll(android.view.View, int, int, int[]);
    public void onNestedScroll(android.view.View, int, int, int, int);
    public void onNestedScrollAccepted(android.view.View, android.view.View, int);
    protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
    public boolean onRequestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean onRequestSendAccessibilityEventInternal(android.view.View, android.view.accessibility.AccessibilityEvent);
    public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
    protected void onSetLayoutParams(android.view.View, android.view.ViewGroup$LayoutParams);
    public boolean onStartNestedScroll(android.view.View, android.view.View, int);
    public void onStopNestedScroll(android.view.View);
    public void onViewAdded(android.view.View);
    public void onViewRemoved(android.view.View);
    public void recomputeViewAttributes(android.view.View);
    public void removeAllViews();
    public void removeAllViewsInLayout();
    protected void removeDetachedView(android.view.View, boolean);
    public void removeTransientView(android.view.View);
    public void removeView(android.view.View);
    public void removeViewAt(int);
    public void removeViewInLayout(android.view.View);
    public void removeViews(int, int);
    public void removeViewsInLayout(int, int);
    public void requestChildFocus(android.view.View, android.view.View);
    public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public void requestDisallowInterceptTouchEvent(boolean);
    public boolean requestFocus(int, android.graphics.Rect);
    public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public void requestTransitionStart(android.animation.LayoutTransition);
    public void requestTransparentRegion(android.view.View);
    protected void resetResolvedDrawables();
    public void resetResolvedLayoutDirection();
    public void resetResolvedPadding();
    public void resetResolvedTextAlignment();
    public void resetResolvedTextDirection();
    protected void resolveDrawables();
    public boolean resolveLayoutDirection();
    public void resolveLayoutParams();
    public void resolvePadding();
    public boolean resolveRtlPropertiesIfNeeded();
    public boolean resolveTextAlignment();
    public boolean resolveTextDirection();
    public boolean restoreDefaultFocus();
    public boolean restoreFocusInCluster(int);
    public boolean restoreFocusNotInCluster();
    public void scheduleLayoutAnimation();
    public void setAddStatesFromChildren(boolean);
    public void setAlwaysDrawnWithCacheEnabled(boolean);
    public void setAnimationCacheEnabled(boolean);
    protected void setChildrenDrawingCacheEnabled(boolean);
    protected void setChildrenDrawingOrderEnabled(boolean);
    protected void setChildrenDrawnWithCacheEnabled(boolean);
    public void setClipChildren(boolean);
    public void setClipToPadding(boolean);
    public void setDescendantFocusability(int);
    public void setLayoutAnimation(android.view.animation.LayoutAnimationController);
    public void setLayoutAnimationListener(android.view.animation.Animation$AnimationListener);
    public void setLayoutMode(int);
    public void setLayoutTransition(android.animation.LayoutTransition);
    public void setMotionEventSplittingEnabled(boolean);
    public void setOnHierarchyChangeListener(android.view.ViewGroup$OnHierarchyChangeListener);
    public void setPersistentDrawingCache(int);
    protected void setStaticTransformationsEnabled(boolean);
    public void setTouchscreenBlocksFocus(boolean);
    public void setTransitionGroup(boolean);
    public boolean shouldDelayChildPressedState();
    public boolean showContextMenuForChild(android.view.View);
    public boolean showContextMenuForChild(android.view.View, float, float);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
    public void startLayoutAnimation();
    public void startViewTransition(android.view.View);
    public void suppressLayout(boolean);
    public void transformPointToViewLocal(float[], android.view.View);
    public void updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams);


    protected static int CLIP_TO_PADDING_MASK;
    protected static int FLAG_DISALLOW_INTERCEPT;
    protected static int FLAG_SUPPORT_STATIC_TRANSFORMATIONS;
    protected static int FLAG_USE_CHILD_DRAWING_ORDER;
    public static int FOCUS_AFTER_DESCENDANTS;
    public static int FOCUS_BEFORE_DESCENDANTS;
    public static int FOCUS_BLOCK_DESCENDANTS;
    public static int LAYOUT_MODE_CLIP_BOUNDS;
    public static int LAYOUT_MODE_DEFAULT;
    public static int LAYOUT_MODE_OPTICAL_BOUNDS;
    public static int PERSISTENT_ALL_CACHES;
    public static int PERSISTENT_ANIMATION_CACHE;
    public static int PERSISTENT_NO_CACHE;
    public static int PERSISTENT_SCROLLING_CACHE;
    protected java.util.ArrayList mDisappearingChildren;
    protected int mGroupFlags;
    protected android.view.ViewGroup$OnHierarchyChangeListener mOnHierarchyChangeListener;
    protected int mPersistentDrawingCache;
}

-keep class android.view.ViewGroup$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(android.view.ViewGroup$LayoutParams);

    public java.lang.String debug(java.lang.String);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public void onDebugDraw(android.view.View, android.graphics.Canvas, android.graphics.Paint);
    public void resolveLayoutDirection(int);
    protected void setBaseAttributes(android.content.res.TypedArray, int, int);
    protected static java.lang.String sizeToString(int);


    public static int FILL_PARENT;
    public static int MATCH_PARENT;
    public static int WRAP_CONTENT;
    public int height;
    public android.view.animation.LayoutAnimationController$AnimationParameters layoutAnimationParameters;
    public int width;
}

-keep class android.view.ViewGroup$MarginLayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.view.ViewGroup$LayoutParams);

    public void copyMarginsFrom(android.view.ViewGroup$MarginLayoutParams);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public int getLayoutDirection();
    public int getMarginEnd();
    public int getMarginStart();
    public boolean isLayoutRtl();
    public boolean isMarginRelative();
    public void onDebugDraw(android.view.View, android.graphics.Canvas, android.graphics.Paint);
    public void resolveLayoutDirection(int);
    public void setLayoutDirection(int);
    public void setMarginEnd(int);
    public void setMarginStart(int);
    public void setMargins(int, int, int, int);
    public void setMarginsRelative(int, int, int, int);


    public static int DEFAULT_MARGIN_RELATIVE;
    public int bottomMargin;
    public int leftMargin;
    public int rightMargin;
    public int topMargin;
}

-keep class android.view.ViewGroup$OnHierarchyChangeListener {

    public abstract void onChildViewAdded(android.view.View, android.view.View);
    public abstract void onChildViewRemoved(android.view.View, android.view.View);


}

-keep class android.view.ViewGroupOverlay {

    public void add(android.view.View);
    public void remove(android.view.View);


}

-keep class android.view.ViewHierarchyEncoder {
    <init>(java.io.ByteArrayOutputStream);

    public void addProperty(java.lang.String, boolean);
    public void addProperty(java.lang.String, short);
    public void addProperty(java.lang.String, int);
    public void addProperty(java.lang.String, float);
    public void addProperty(java.lang.String, java.lang.String);
    public void addPropertyKey(java.lang.String);
    public void beginObject(java.lang.Object);
    public void endObject();
    public void endStream();


}

-keep class android.view.ViewOutlineProvider {
    <init>();

    public abstract void getOutline(android.view.View, android.graphics.Outline);


    public static android.view.ViewOutlineProvider BACKGROUND;
    public static android.view.ViewOutlineProvider BOUNDS;
    public static android.view.ViewOutlineProvider PADDED_BOUNDS;
}

-keep class android.view.ViewOverlay {

    public void add(android.graphics.drawable.Drawable);
    public void clear();
    public void remove(android.graphics.drawable.Drawable);


}

-keep class android.view.ViewParent {

    public abstract void bringChildToFront(android.view.View);
    public abstract boolean canResolveLayoutDirection();
    public abstract boolean canResolveTextAlignment();
    public abstract boolean canResolveTextDirection();
    public abstract void childDrawableStateChanged(android.view.View);
    public abstract void childHasTransientStateChanged(android.view.View, boolean);
    public abstract void clearChildFocus(android.view.View);
    public abstract void createContextMenu(android.view.ContextMenu);
    public abstract android.view.View focusSearch(android.view.View, int);
    public abstract void focusableViewAvailable(android.view.View);
    public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    public abstract int getLayoutDirection();
    public abstract android.view.ViewParent getParent();
    public abstract android.view.ViewParent getParentForAccessibility();
    public abstract int getTextAlignment();
    public abstract int getTextDirection();
    public abstract void invalidateChild(android.view.View, android.graphics.Rect);
    public abstract android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    public abstract boolean isLayoutDirectionResolved();
    public abstract boolean isLayoutRequested();
    public abstract boolean isTextAlignmentResolved();
    public abstract boolean isTextDirectionResolved();
    public abstract android.view.View keyboardNavigationClusterSearch(android.view.View, int);
    public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
    public void onDescendantInvalidated(android.view.View, android.view.View);
    public abstract boolean onNestedFling(android.view.View, float, float, boolean);
    public abstract boolean onNestedPreFling(android.view.View, float, float);
    public abstract boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
    public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
    public abstract void onNestedScroll(android.view.View, int, int, int, int);
    public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
    public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
    public abstract void onStopNestedScroll(android.view.View);
    public abstract void recomputeViewAttributes(android.view.View);
    public abstract void requestChildFocus(android.view.View, android.view.View);
    public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public abstract void requestDisallowInterceptTouchEvent(boolean);
    public abstract void requestFitSystemWindows();
    public abstract void requestLayout();
    public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public abstract void requestTransparentRegion(android.view.View);
    public abstract boolean showContextMenuForChild(android.view.View);
    public abstract boolean showContextMenuForChild(android.view.View, float, float);
    public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
    public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);


}

-keep class android.view.ViewPropertyAnimator {

    public android.view.ViewPropertyAnimator alpha(float);
    public android.view.ViewPropertyAnimator alphaBy(float);
    public void cancel();
    public long getDuration();
    public android.animation.TimeInterpolator getInterpolator();
    public long getStartDelay();
    public android.view.ViewPropertyAnimator rotation(float);
    public android.view.ViewPropertyAnimator rotationBy(float);
    public android.view.ViewPropertyAnimator rotationX(float);
    public android.view.ViewPropertyAnimator rotationXBy(float);
    public android.view.ViewPropertyAnimator rotationY(float);
    public android.view.ViewPropertyAnimator rotationYBy(float);
    public android.view.ViewPropertyAnimator scaleX(float);
    public android.view.ViewPropertyAnimator scaleXBy(float);
    public android.view.ViewPropertyAnimator scaleY(float);
    public android.view.ViewPropertyAnimator scaleYBy(float);
    public android.view.ViewPropertyAnimator setDuration(long);
    public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
    public android.view.ViewPropertyAnimator setListener(android.animation.Animator$AnimatorListener);
    public android.view.ViewPropertyAnimator setStartDelay(long);
    public android.view.ViewPropertyAnimator setUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
    public void start();
    public android.view.ViewPropertyAnimator translationX(float);
    public android.view.ViewPropertyAnimator translationXBy(float);
    public android.view.ViewPropertyAnimator translationY(float);
    public android.view.ViewPropertyAnimator translationYBy(float);
    public android.view.ViewPropertyAnimator translationZ(float);
    public android.view.ViewPropertyAnimator translationZBy(float);
    public android.view.ViewPropertyAnimator withEndAction(java.lang.Runnable);
    public android.view.ViewPropertyAnimator withLayer();
    public android.view.ViewPropertyAnimator withStartAction(java.lang.Runnable);
    public android.view.ViewPropertyAnimator x(float);
    public android.view.ViewPropertyAnimator xBy(float);
    public android.view.ViewPropertyAnimator y(float);
    public android.view.ViewPropertyAnimator yBy(float);
    public android.view.ViewPropertyAnimator z(float);
    public android.view.ViewPropertyAnimator zBy(float);


}

-keep class android.view.ViewRootImpl {
    <init>(android.content.Context, android.view.Display);

    public static void addConfigCallback(android.view.ViewRootImpl$ConfigChangedCallback);
    public static void addFirstDrawHandler(java.lang.Runnable);
    public void addWindowCallbacks(android.view.WindowCallbacks);
    public void bringChildToFront(android.view.View);
    public boolean canResolveLayoutDirection();
    public boolean canResolveTextAlignment();
    public boolean canResolveTextDirection();
    public void cancelInvalidate(android.view.View);
    public void childDrawableStateChanged(android.view.View);
    public void childHasTransientStateChanged(android.view.View, boolean);
    public void clearChildFocus(android.view.View);
    public void createContextMenu(android.view.ContextMenu);
    public void debug();
    public void detachFunctor(long);
    public void dispatchAppVisibility(boolean);
    public void dispatchCheckFocus();
    public void dispatchCloseSystemDialogs(java.lang.String);
    public void dispatchDragEvent(android.view.DragEvent);
    public void dispatchGetNewSurface();
    public void dispatchInputEvent(android.view.InputEvent);
    public void dispatchInputEvent(android.view.InputEvent, android.view.InputEventReceiver);
    public void dispatchInvalidateDelayed(android.view.View, long);
    public void dispatchInvalidateOnAnimation(android.view.View);
    public void dispatchInvalidateRectDelayed(android.view.View$AttachInfo$InvalidateInfo, long);
    public void dispatchInvalidateRectOnAnimation(android.view.View$AttachInfo$InvalidateInfo);
    public void dispatchKeyFromAutofill(android.view.KeyEvent);
    public void dispatchKeyFromIme(android.view.KeyEvent);
    public void dispatchMoved(int, int);
    public void dispatchPointerCaptureChanged(boolean);
    public void dispatchRequestKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
    public void dispatchSystemUiVisibilityChanged(int, int, int, int);
    public void dispatchUnhandledInputEvent(android.view.InputEvent);
    public boolean dispatchUnhandledKeyEvent(android.view.KeyEvent);
    public void dispatchWindowShown();
    public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    public void dumpGfxInfo(int[]);
    public android.view.View focusSearch(android.view.View, int);
    public void focusableViewAvailable(android.view.View);
    public android.view.View getAccessibilityFocusedHost();
    public android.view.accessibility.AccessibilityNodeInfo getAccessibilityFocusedVirtualView();
    public android.view.AccessibilityInteractionController getAccessibilityInteractionController();
    public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    public int getDisplayId();
    public int getHeight();
    public void getLastTouchPoint(android.graphics.Point);
    public int getLastTouchSource();
    public int getLayoutDirection();
    public android.view.ViewParent getParent();
    public android.view.ViewParent getParentForAccessibility();
    public int getTextAlignment();
    public int getTextDirection();
    public java.lang.CharSequence getTitle();
    public android.view.View getView();
    public int getWidth();
    public int getWindowFlags();
    public void handleDispatchSystemUiVisibilityChanged(android.view.ViewRootImpl$SystemUiVisibilityInfo);
    public void handleDispatchWindowShown();
    public void handleRequestKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
    public void invalidateChild(android.view.View, android.graphics.Rect);
    public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    public static void invokeFunctor(long, boolean);
    public boolean isLayoutDirectionResolved();
    public boolean isLayoutRequested();
    public boolean isTextAlignmentResolved();
    public boolean isTextDirectionResolved();
    public static boolean isViewDescendantOf(android.view.View, android.view.View);
    public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
    public void loadSystemProperties();
    public void notifyChildRebuilt();
    public void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
    public void onDescendantInvalidated(android.view.View, android.view.View);
    public void onMovedToDisplay(int, android.content.res.Configuration);
    public boolean onNestedFling(android.view.View, float, float, boolean);
    public boolean onNestedPreFling(android.view.View, float, float);
    public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
    public void onNestedPreScroll(android.view.View, int, int, int[]);
    public void onNestedScroll(android.view.View, int, int, int, int);
    public void onNestedScrollAccepted(android.view.View, android.view.View, int);
    public void onPostDraw(android.view.DisplayListCanvas);
    public void onPreDraw(android.view.DisplayListCanvas);
    public boolean onStartNestedScroll(android.view.View, android.view.View, int);
    public void onStopNestedScroll(android.view.View);
    public void onWindowTitleChanged();
    public boolean performHapticFeedback(int, boolean);
    public void playSoundEffect(int);
    public void profile();
    public void recomputeViewAttributes(android.view.View);
    public void registerAnimatingRenderNode(android.view.RenderNode);
    public void registerRtFrameCallback(android.view.ThreadedRenderer$FrameDrawingCallback);
    public void registerVectorDrawableAnimator(android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT);
    public void removeWindowCallbacks(android.view.WindowCallbacks);
    public void reportActivityRelaunched();
    public void reportDrawFinish();
    public void requestChildFocus(android.view.View, android.view.View);
    public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public void requestDisallowInterceptTouchEvent(boolean);
    public void requestFitSystemWindows();
    public void requestInvalidateRootRenderNode();
    public void requestLayout();
    public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    public void requestTransitionStart(android.animation.LayoutTransition);
    public void requestTransparentRegion(android.view.View);
    public void requestUpdateConfiguration(android.content.res.Configuration);
    public void setActivityConfigCallback(android.view.ViewRootImpl$ActivityConfigCallback);
    public void setDragFocus(android.view.View, android.view.DragEvent);
    public void setIsAmbientMode(boolean);
    public void setPausedForTransition(boolean);
    public void setReportNextDraw();
    public void setView(android.view.View, android.view.WindowManager$LayoutParams, android.view.View);
    public boolean showContextMenuForChild(android.view.View);
    public boolean showContextMenuForChild(android.view.View, float, float);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
    public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
    public void synthesizeInputEvent(android.view.InputEvent);
    public void updateConfiguration(int);
    public void updatePointerIcon(float, float);
    public void windowFocusChanged(boolean, boolean);


    public static java.lang.String PROPERTY_EMULATOR_WIN_OUTSET_BOTTOM_PX;
    protected android.view.InputEventConsistencyVerifier mInputEventConsistencyVerifier;
    public boolean mIsAnimating;
    public android.view.Surface mSurface;
    public boolean mTraversalScheduled;
    public android.view.WindowManager$LayoutParams mWindowAttributes;
}

-keep class android.view.ViewRootImpl$ActivityConfigCallback {

    public abstract void onConfigurationChanged(android.content.res.Configuration, int);


}

-keep class android.view.ViewRootImpl$ConfigChangedCallback {

    public abstract void onConfigurationChanged(android.content.res.Configuration);


}

-keep class android.view.ViewRootImpl$SystemUiVisibilityInfo {



}

-keep class android.view.ViewStructure {
    <init>();

    public abstract int addChildCount(int);
    public abstract void asyncCommit();
    public abstract android.view.ViewStructure asyncNewChild(int);
    public abstract android.view.autofill.AutofillId getAutofillId();
    public abstract int getChildCount();
    public abstract android.os.Bundle getExtras();
    public abstract java.lang.CharSequence getHint();
    public abstract android.graphics.Rect getTempRect();
    public abstract java.lang.CharSequence getText();
    public abstract int getTextSelectionEnd();
    public abstract int getTextSelectionStart();
    public abstract boolean hasExtras();
    public abstract android.view.ViewStructure newChild(int);
    public abstract android.view.ViewStructure$HtmlInfo$Builder newHtmlInfoBuilder(java.lang.String);
    public abstract void setAccessibilityFocused(boolean);
    public abstract void setActivated(boolean);
    public abstract void setAlpha(float);
    public abstract void setAssistBlocked(boolean);
    public abstract void setAutofillHints(java.lang.String[]);
    public abstract void setAutofillId(android.view.autofill.AutofillId);
    public abstract void setAutofillId(android.view.autofill.AutofillId, int);
    public abstract void setAutofillOptions(java.lang.CharSequence[]);
    public abstract void setAutofillType(int);
    public abstract void setAutofillValue(android.view.autofill.AutofillValue);
    public abstract void setCheckable(boolean);
    public abstract void setChecked(boolean);
    public abstract void setChildCount(int);
    public abstract void setClassName(java.lang.String);
    public abstract void setClickable(boolean);
    public abstract void setContentDescription(java.lang.CharSequence);
    public abstract void setContextClickable(boolean);
    public abstract void setDataIsSensitive(boolean);
    public abstract void setDimens(int, int, int, int, int, int);
    public abstract void setElevation(float);
    public abstract void setEnabled(boolean);
    public abstract void setFocusable(boolean);
    public abstract void setFocused(boolean);
    public abstract void setHint(java.lang.CharSequence);
    public abstract void setHtmlInfo(android.view.ViewStructure$HtmlInfo);
    public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
    public void setImportantForAutofill(int);
    public abstract void setInputType(int);
    public abstract void setLocaleList(android.os.LocaleList);
    public abstract void setLongClickable(boolean);
    public void setMaxTextEms(int);
    public void setMaxTextLength(int);
    public void setMinTextEms(int);
    public abstract void setOpaque(boolean);
    public abstract void setSelected(boolean);
    public abstract void setText(java.lang.CharSequence);
    public abstract void setText(java.lang.CharSequence, int, int);
    public void setTextIdEntry(java.lang.String);
    public abstract void setTextLines(int[], int[]);
    public abstract void setTextStyle(float, int, int, int);
    public abstract void setTransformation(android.graphics.Matrix);
    public abstract void setVisibility(int);
    public abstract void setWebDomain(java.lang.String);


}

-keep class android.view.ViewStructure$HtmlInfo {
    <init>();

    public abstract java.util.List getAttributes();
    public abstract java.lang.String getTag();


}

-keep class android.view.ViewStructure$HtmlInfo$Builder {
    <init>();

    public abstract android.view.ViewStructure$HtmlInfo$Builder addAttribute(java.lang.String, java.lang.String);
    public abstract android.view.ViewStructure$HtmlInfo build();


}

-keep class android.view.ViewTreeObserver {

    public void addOnComputeInternalInsetsListener(android.view.ViewTreeObserver$OnComputeInternalInsetsListener);
    public void addOnDrawListener(android.view.ViewTreeObserver$OnDrawListener);
    public void addOnEnterAnimationCompleteListener(android.view.ViewTreeObserver$OnEnterAnimationCompleteListener);
    public void addOnGlobalFocusChangeListener(android.view.ViewTreeObserver$OnGlobalFocusChangeListener);
    public void addOnGlobalLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
    public void addOnPreDrawListener(android.view.ViewTreeObserver$OnPreDrawListener);
    public void addOnScrollChangedListener(android.view.ViewTreeObserver$OnScrollChangedListener);
    public void addOnTouchModeChangeListener(android.view.ViewTreeObserver$OnTouchModeChangeListener);
    public void addOnWindowAttachListener(android.view.ViewTreeObserver$OnWindowAttachListener);
    public void addOnWindowFocusChangeListener(android.view.ViewTreeObserver$OnWindowFocusChangeListener);
    public void addOnWindowShownListener(android.view.ViewTreeObserver$OnWindowShownListener);
    public void dispatchOnDraw();
    public void dispatchOnEnterAnimationComplete();
    public void dispatchOnGlobalLayout();
    public boolean dispatchOnPreDraw();
    public void dispatchOnWindowShown();
    public boolean isAlive();
    public void removeGlobalOnLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
    public void removeOnComputeInternalInsetsListener(android.view.ViewTreeObserver$OnComputeInternalInsetsListener);
    public void removeOnDrawListener(android.view.ViewTreeObserver$OnDrawListener);
    public void removeOnEnterAnimationCompleteListener(android.view.ViewTreeObserver$OnEnterAnimationCompleteListener);
    public void removeOnGlobalFocusChangeListener(android.view.ViewTreeObserver$OnGlobalFocusChangeListener);
    public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
    public void removeOnPreDrawListener(android.view.ViewTreeObserver$OnPreDrawListener);
    public void removeOnScrollChangedListener(android.view.ViewTreeObserver$OnScrollChangedListener);
    public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver$OnTouchModeChangeListener);
    public void removeOnWindowAttachListener(android.view.ViewTreeObserver$OnWindowAttachListener);
    public void removeOnWindowFocusChangeListener(android.view.ViewTreeObserver$OnWindowFocusChangeListener);
    public void removeOnWindowShownListener(android.view.ViewTreeObserver$OnWindowShownListener);


}

-keep class android.view.ViewTreeObserver$InternalInsetsInfo {
    <init>();

    public boolean equals(java.lang.Object);
    public int hashCode();
    public void setTouchableInsets(int);


    public static int TOUCHABLE_INSETS_CONTENT;
    public static int TOUCHABLE_INSETS_FRAME;
    public static int TOUCHABLE_INSETS_REGION;
    public static int TOUCHABLE_INSETS_VISIBLE;
    public android.graphics.Rect contentInsets;
    public android.graphics.Region touchableRegion;
    public android.graphics.Rect visibleInsets;
}

-keep class android.view.ViewTreeObserver$OnComputeInternalInsetsListener {

    public abstract void onComputeInternalInsets(android.view.ViewTreeObserver$InternalInsetsInfo);


}

-keep class android.view.ViewTreeObserver$OnDrawListener {

    public abstract void onDraw();


}

-keep class android.view.ViewTreeObserver$OnEnterAnimationCompleteListener {

    public abstract void onEnterAnimationComplete();


}

-keep class android.view.ViewTreeObserver$OnGlobalFocusChangeListener {

    public abstract void onGlobalFocusChanged(android.view.View, android.view.View);


}

-keep class android.view.ViewTreeObserver$OnGlobalLayoutListener {

    public abstract void onGlobalLayout();


}

-keep class android.view.ViewTreeObserver$OnPreDrawListener {

    public abstract boolean onPreDraw();


}

-keep class android.view.ViewTreeObserver$OnScrollChangedListener {

    public abstract void onScrollChanged();


}

-keep class android.view.ViewTreeObserver$OnTouchModeChangeListener {

    public abstract void onTouchModeChanged(boolean);


}

-keep class android.view.ViewTreeObserver$OnWindowAttachListener {

    public abstract void onWindowAttached();
    public abstract void onWindowDetached();


}

-keep class android.view.ViewTreeObserver$OnWindowFocusChangeListener {

    public abstract void onWindowFocusChanged(boolean);


}

-keep class android.view.ViewTreeObserver$OnWindowShownListener {

    public abstract void onWindowShown();


}

-keep class android.view.Window {
    <init>(android.content.Context);

    public abstract void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addFlags(int);
    public void addOnFrameMetricsAvailableListener(android.view.Window$OnFrameMetricsAvailableListener, android.os.Handler);
    public void addPrivateFlags(int);
    public abstract void alwaysReadCloseOnTouchAttr();
    public abstract void clearContentView();
    public void clearFlags(int);
    public abstract void closeAllPanels();
    public abstract void closePanel(int);
    public void destroy();
    public void dispatchOnWindowDismissed(boolean, boolean);
    public void dispatchOnWindowSwipeDismissed();
    protected void dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public android.view.View findViewById(int);
    public boolean getAllowEnterTransitionOverlap();
    public boolean getAllowReturnTransitionOverlap();
    public android.view.WindowManager$LayoutParams getAttributes();
    public android.view.Window$Callback getCallback();
    public int getColorMode();
    public android.view.Window getContainer();
    public android.transition.Scene getContentScene();
    public android.content.Context getContext();
    public abstract android.view.View getCurrentFocus();
    public abstract android.view.View getDecorView();
    public static int getDefaultFeatures(android.content.Context);
    public float getElevation();
    public android.transition.Transition getEnterTransition();
    public android.transition.Transition getExitTransition();
    protected int getFeatures();
    protected int getForcedWindowFlags();
    public abstract android.view.LayoutInflater getLayoutInflater();
    protected int getLocalFeatures();
    public android.media.session.MediaController getMediaController();
    public abstract int getNavigationBarColor();
    public int getNavigationBarDividerColor();
    public android.transition.Transition getReenterTransition();
    public android.transition.Transition getReturnTransition();
    public android.transition.Transition getSharedElementEnterTransition();
    public android.transition.Transition getSharedElementExitTransition();
    public android.transition.Transition getSharedElementReenterTransition();
    public android.transition.Transition getSharedElementReturnTransition();
    public boolean getSharedElementsUseOverlay();
    public abstract int getStatusBarColor();
    public long getTransitionBackgroundFadeDuration();
    public android.transition.TransitionManager getTransitionManager();
    public abstract int getVolumeControlStream();
    public android.view.Window$WindowControllerCallback getWindowControllerCallback();
    public android.view.WindowManager getWindowManager();
    public android.content.res.TypedArray getWindowStyle();
    public boolean hasChildren();
    public boolean hasFeature(int);
    protected boolean hasSoftInputMode();
    protected boolean haveDimAmount();
    public void injectInputEvent(android.view.InputEvent);
    public abstract void invalidatePanelMenu(int);
    public boolean isActive();
    public boolean isCloseOnSwipeEnabled();
    public boolean isDestroyed();
    public abstract boolean isFloating();
    public boolean isOverlayWithDecorCaptionEnabled();
    public abstract boolean isShortcutKey(int, android.view.KeyEvent);
    public boolean isWideColorGamut();
    public void makeActive();
    public void notifyRestrictedCaptionAreaCallback(int, int, int, int);
    protected abstract void onActive();
    public abstract void onConfigurationChanged(android.content.res.Configuration);
    public abstract void onMultiWindowModeChanged();
    public abstract void onPictureInPictureModeChanged(boolean);
    public abstract void openPanel(int, android.view.KeyEvent);
    public abstract android.view.View peekDecorView();
    public abstract boolean performContextMenuIdentifierAction(int, int);
    public abstract boolean performPanelIdentifierAction(int, int, int);
    public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int);
    protected void removeFeature(int);
    public void removeOnFrameMetricsAvailableListener(android.view.Window$OnFrameMetricsAvailableListener);
    public abstract void reportActivityRelaunched();
    public boolean requestFeature(int);
    public android.view.View requireViewById(int);
    public abstract void restoreHierarchyState(android.os.Bundle);
    public abstract android.os.Bundle saveHierarchyState();
    public void setAllowEnterTransitionOverlap(boolean);
    public void setAllowReturnTransitionOverlap(boolean);
    public void setAttributes(android.view.WindowManager$LayoutParams);
    public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public void setBackgroundDrawableResource(int);
    public void setCallback(android.view.Window$Callback);
    public abstract void setChildDrawable(int, android.graphics.drawable.Drawable);
    public abstract void setChildInt(int, int);
    public void setClipToOutline(boolean);
    public void setCloseOnSwipeEnabled(boolean);
    public void setCloseOnTouchOutside(boolean);
    public void setCloseOnTouchOutsideIfNotSet(boolean);
    public void setColorMode(int);
    public void setContainer(android.view.Window);
    public abstract void setContentView(int);
    public abstract void setContentView(android.view.View);
    public abstract void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
    public abstract void setDecorCaptionShade(int);
    public void setDefaultIcon(int);
    public void setDefaultLogo(int);
    protected void setDefaultWindowFormat(int);
    public void setDimAmount(float);
    public void setElevation(float);
    public void setEnterTransition(android.transition.Transition);
    public void setExitTransition(android.transition.Transition);
    public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    public abstract void setFeatureDrawableAlpha(int, int);
    public abstract void setFeatureDrawableResource(int, int);
    public abstract void setFeatureDrawableUri(int, android.net.Uri);
    public abstract void setFeatureInt(int, int);
    public void setFlags(int, int);
    public void setFormat(int);
    public void setGravity(int);
    public void setIcon(int);
    public void setLayout(int, int);
    public void setLocalFocus(boolean, boolean);
    public void setLogo(int);
    public void setMediaController(android.media.session.MediaController);
    public abstract void setNavigationBarColor(int);
    public void setNavigationBarDividerColor(int);
    protected void setNeedsMenuKey(int);
    public void setOnWindowDismissedCallback(android.view.Window$OnWindowDismissedCallback);
    public void setOnWindowSwipeDismissedCallback(android.view.Window$OnWindowSwipeDismissedCallback);
    public void setOverlayWithDecorCaptionEnabled(boolean);
    public void setReenterTransition(android.transition.Transition);
    public abstract void setResizingCaptionDrawable(android.graphics.drawable.Drawable);
    public void setRestrictedCaptionAreaListener(android.view.Window$OnRestrictedCaptionAreaChangedListener);
    public void setReturnTransition(android.transition.Transition);
    public void setSharedElementEnterTransition(android.transition.Transition);
    public void setSharedElementExitTransition(android.transition.Transition);
    public void setSharedElementReenterTransition(android.transition.Transition);
    public void setSharedElementReturnTransition(android.transition.Transition);
    public void setSharedElementsUseOverlay(boolean);
    public void setSoftInputMode(int);
    public abstract void setStatusBarColor(int);
    public void setSustainedPerformanceMode(boolean);
    public void setTheme(int);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setTitleColor(int);
    public void setTransitionBackgroundFadeDuration(long);
    public void setTransitionManager(android.transition.TransitionManager);
    public void setType(int);
    public void setUiOptions(int);
    public void setUiOptions(int, int);
    public abstract void setVolumeControlStream(int);
    public void setWindowAnimations(int);
    public void setWindowControllerCallback(android.view.Window$WindowControllerCallback);
    public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String);
    public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String, boolean);
    public boolean shouldCloseOnTouch(android.content.Context, android.view.MotionEvent);
    public abstract boolean superDispatchGenericMotionEvent(android.view.MotionEvent);
    public abstract boolean superDispatchKeyEvent(android.view.KeyEvent);
    public abstract boolean superDispatchKeyShortcutEvent(android.view.KeyEvent);
    public abstract boolean superDispatchTouchEvent(android.view.MotionEvent);
    public abstract boolean superDispatchTrackballEvent(android.view.MotionEvent);
    public abstract void takeInputQueue(android.view.InputQueue$Callback);
    public abstract void takeKeyEvents(boolean);
    public abstract void takeSurface(android.view.SurfaceHolder$Callback2);
    public abstract void togglePanel(int, android.view.KeyEvent);


    public static int DECOR_CAPTION_SHADE_AUTO;
    public static int DECOR_CAPTION_SHADE_DARK;
    public static int DECOR_CAPTION_SHADE_LIGHT;
    protected static int DEFAULT_FEATURES;
    public static int FEATURE_ACTION_BAR;
    public static int FEATURE_ACTION_BAR_OVERLAY;
    public static int FEATURE_ACTION_MODE_OVERLAY;
    public static int FEATURE_ACTIVITY_TRANSITIONS;
    public static int FEATURE_CONTENT_TRANSITIONS;
    public static int FEATURE_CONTEXT_MENU;
    public static int FEATURE_CUSTOM_TITLE;
    public static int FEATURE_INDETERMINATE_PROGRESS;
    public static int FEATURE_LEFT_ICON;
    public static int FEATURE_MAX;
    public static int FEATURE_NO_TITLE;
    public static int FEATURE_OPTIONS_PANEL;
    public static int FEATURE_PROGRESS;
    public static int FEATURE_RIGHT_ICON;
    public static int FEATURE_SWIPE_TO_DISMISS;
    public static int ID_ANDROID_CONTENT;
    public static java.lang.String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME;
    public static int PROGRESS_END;
    public static int PROGRESS_INDETERMINATE_OFF;
    public static int PROGRESS_INDETERMINATE_ON;
    public static int PROGRESS_SECONDARY_END;
    public static int PROGRESS_SECONDARY_START;
    public static int PROGRESS_START;
    public static int PROGRESS_VISIBILITY_OFF;
    public static int PROGRESS_VISIBILITY_ON;
    public static java.lang.String STATUS_BAR_BACKGROUND_TRANSITION_NAME;
}

-keep class android.view.Window$Callback {

    public abstract boolean dispatchGenericMotionEvent(android.view.MotionEvent);
    public abstract boolean dispatchKeyEvent(android.view.KeyEvent);
    public abstract boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    public abstract boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    public abstract boolean dispatchTouchEvent(android.view.MotionEvent);
    public abstract boolean dispatchTrackballEvent(android.view.MotionEvent);
    public abstract void onActionModeFinished(android.view.ActionMode);
    public abstract void onActionModeStarted(android.view.ActionMode);
    public abstract void onAttachedToWindow();
    public abstract void onContentChanged();
    public abstract boolean onCreatePanelMenu(int, android.view.Menu);
    public abstract android.view.View onCreatePanelView(int);
    public abstract void onDetachedFromWindow();
    public abstract boolean onMenuItemSelected(int, android.view.MenuItem);
    public abstract boolean onMenuOpened(int, android.view.Menu);
    public abstract void onPanelClosed(int, android.view.Menu);
    public void onPointerCaptureChanged(boolean);
    public abstract boolean onPreparePanel(int, android.view.View, android.view.Menu);
    public void onProvideKeyboardShortcuts(java.util.List, android.view.Menu, int);
    public abstract boolean onSearchRequested();
    public abstract boolean onSearchRequested(android.view.SearchEvent);
    public abstract void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
    public abstract void onWindowFocusChanged(boolean);
    public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
    public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);


}

-keep class android.view.Window$OnFrameMetricsAvailableListener {

    public abstract void onFrameMetricsAvailable(android.view.Window, android.view.FrameMetrics, int);


}

-keep class android.view.Window$OnRestrictedCaptionAreaChangedListener {

    public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect);


}

-keep class android.view.Window$OnWindowDismissedCallback {

    public abstract void onWindowDismissed(boolean, boolean);


}

-keep class android.view.Window$OnWindowSwipeDismissedCallback {

    public abstract void onWindowSwipeDismissed();


}

-keep class android.view.Window$WindowControllerCallback {

    public abstract void enterPictureInPictureModeIfPossible();
    public abstract void exitFreeformMode();
    public abstract boolean isTaskRoot();


}

-keep class android.view.WindowAnimationFrameStats {
    <init>();

    public int describeContents();
    public void init(long, long[]);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.WindowCallbacks {

    public abstract boolean onContentDrawn(int, int, int, int);
    public abstract void onPostDraw(android.view.DisplayListCanvas);
    public abstract void onRequestDraw(boolean);
    public abstract void onWindowDragResizeEnd();
    public abstract void onWindowDragResizeStart(android.graphics.Rect, boolean, android.graphics.Rect, android.graphics.Rect, int);
    public abstract void onWindowSizeIsChanging(android.graphics.Rect, boolean, android.graphics.Rect, android.graphics.Rect);


    public static int RESIZE_MODE_DOCKED_DIVIDER;
    public static int RESIZE_MODE_FREEFORM;
    public static int RESIZE_MODE_INVALID;
}

-keep class android.view.WindowContentFrameStats {
    <init>();

    public int describeContents();
    public long getFramePostedTimeNano(int);
    public long getFrameReadyTimeNano(int);
    public void init(long, long[], long[], long[]);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.WindowId {
    <init>(android.view.IWindowId);
    <init>(android.os.IBinder);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public android.view.IWindowId getTarget();
    public int hashCode();
    public boolean isFocused();
    public void registerFocusObserver(android.view.WindowId$FocusObserver);
    public java.lang.String toString();
    public void unregisterFocusObserver(android.view.WindowId$FocusObserver);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.WindowId$FocusObserver {
    <init>();

    public abstract void onFocusGained(android.view.WindowId);
    public abstract void onFocusLost(android.view.WindowId);


}

-keep class android.view.WindowInsets {
    <init>(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, boolean, boolean, android.view.DisplayCutout);
    <init>(android.view.WindowInsets);
    <init>(android.graphics.Rect);

    public android.view.WindowInsets consumeDisplayCutout();
    public android.view.WindowInsets consumeStableInsets();
    public android.view.WindowInsets consumeSystemWindowInsets();
    public android.view.WindowInsets consumeSystemWindowInsets(boolean, boolean, boolean, boolean);
    public android.view.WindowInsets consumeWindowDecorInsets();
    public android.view.WindowInsets consumeWindowDecorInsets(boolean, boolean, boolean, boolean);
    public boolean equals(java.lang.Object);
    public android.view.DisplayCutout getDisplayCutout();
    public int getStableInsetBottom();
    public int getStableInsetLeft();
    public int getStableInsetRight();
    public int getStableInsetTop();
    public int getSystemWindowInsetBottom();
    public int getSystemWindowInsetLeft();
    public int getSystemWindowInsetRight();
    public int getSystemWindowInsetTop();
    public android.graphics.Rect getSystemWindowInsets();
    public int getWindowDecorInsetBottom();
    public int getWindowDecorInsetLeft();
    public int getWindowDecorInsetRight();
    public int getWindowDecorInsetTop();
    public boolean hasInsets();
    public boolean hasStableInsets();
    public boolean hasSystemWindowInsets();
    public boolean hasWindowDecorInsets();
    public int hashCode();
    public android.view.WindowInsets inset(android.graphics.Rect);
    public android.view.WindowInsets inset(int, int, int, int);
    public boolean isConsumed();
    public boolean isRound();
    public android.view.WindowInsets replaceSystemWindowInsets(int, int, int, int);
    public android.view.WindowInsets replaceSystemWindowInsets(android.graphics.Rect);
    public android.view.WindowInsets replaceWindowDecorInsets(int, int, int, int);
    public boolean shouldAlwaysConsumeNavBar();
    public java.lang.String toString();


    public static android.view.WindowInsets CONSUMED;
}

-keep class android.view.WindowManager {

    public abstract android.graphics.Region getCurrentImeTouchRegion();
    public abstract android.view.Display getDefaultDisplay();
    public abstract void removeViewImmediate(android.view.View);
    public abstract void requestAppKeyboardShortcuts(android.view.WindowManager$KeyboardShortcutsReceiver, int);


    public static int DOCKED_BOTTOM;
    public static int DOCKED_INVALID;
    public static int DOCKED_LEFT;
    public static int DOCKED_RIGHT;
    public static int DOCKED_TOP;
    public static java.lang.String INPUT_CONSUMER_NAVIGATION;
    public static java.lang.String INPUT_CONSUMER_PIP;
    public static java.lang.String INPUT_CONSUMER_RECENTS_ANIMATION;
    public static java.lang.String INPUT_CONSUMER_WALLPAPER;
    public static java.lang.String PARCEL_KEY_SHORTCUTS_ARRAY;
    public static int TAKE_SCREENSHOT_FULLSCREEN;
    public static int TAKE_SCREENSHOT_SELECTED_REGION;
    public static int TRANSIT_ACTIVITY_CLOSE;
    public static int TRANSIT_ACTIVITY_OPEN;
    public static int TRANSIT_ACTIVITY_RELAUNCH;
    public static int TRANSIT_CRASHING_ACTIVITY_CLOSE;
    public static int TRANSIT_DOCK_TASK_FROM_RECENTS;
    public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
    public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
    public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
    public static int TRANSIT_KEYGUARD_GOING_AWAY;
    public static int TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
    public static int TRANSIT_KEYGUARD_OCCLUDE;
    public static int TRANSIT_KEYGUARD_UNOCCLUDE;
    public static int TRANSIT_NONE;
    public static int TRANSIT_TASK_CLOSE;
    public static int TRANSIT_TASK_IN_PLACE;
    public static int TRANSIT_TASK_OPEN;
    public static int TRANSIT_TASK_OPEN_BEHIND;
    public static int TRANSIT_TASK_TO_BACK;
    public static int TRANSIT_TASK_TO_FRONT;
    public static int TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
    public static int TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
    public static int TRANSIT_UNSET;
    public static int TRANSIT_WALLPAPER_CLOSE;
    public static int TRANSIT_WALLPAPER_INTRA_CLOSE;
    public static int TRANSIT_WALLPAPER_INTRA_OPEN;
    public static int TRANSIT_WALLPAPER_OPEN;
}

-keep class android.view.WindowManager$KeyboardShortcutsReceiver {

    public abstract void onKeyboardShortcutsReceived(java.util.List);


}

-keep class android.view.WindowManager$LayoutParams {
    <init>();
    <init>(int);
    <init>(int, int);
    <init>(int, int, int);
    <init>(int, int, int, int, int);
    <init>(int, int, int, int, int, int, int);
    <init>(android.os.Parcel);

    public int copyFrom(android.view.WindowManager$LayoutParams);
    public java.lang.String debug(java.lang.String);
    public int describeContents();
    public void dumpDimensions(java.lang.StringBuilder);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public int getColorMode();
    public java.lang.CharSequence getTitle();
    public long getUserActivityTimeout();
    public boolean isFullscreen();
    public static boolean isSystemAlertWindowType(int);
    public static boolean mayUseInputMethod(int);
    public void scale(float);
    public void setColorMode(int);
    public void setSurfaceInsets(android.view.View, boolean, boolean);
    public void setTitle(java.lang.CharSequence);
    public void setUserActivityTimeout(long);
    public java.lang.String toString();
    public java.lang.String toString(java.lang.String);
    public void writeToParcel(android.os.Parcel, int);
    public void writeToProto(android.util.proto.ProtoOutputStream, long);


    public static int ACCESSIBILITY_ANCHOR_CHANGED;
    public static int ACCESSIBILITY_TITLE_CHANGED;
    public static int ALPHA_CHANGED;
    public static int ANIMATION_CHANGED;
    public static float BRIGHTNESS_OVERRIDE_FULL;
    public static float BRIGHTNESS_OVERRIDE_NONE;
    public static float BRIGHTNESS_OVERRIDE_OFF;
    public static int BUTTON_BRIGHTNESS_CHANGED;
    public static int COLOR_MODE_CHANGED;
    public static android.os.Parcelable$Creator CREATOR;
    public static int DIM_AMOUNT_CHANGED;
    public static int EVERYTHING_CHANGED;
    public static int FIRST_APPLICATION_WINDOW;
    public static int FIRST_SUB_WINDOW;
    public static int FIRST_SYSTEM_WINDOW;
    public static int FLAGS_CHANGED;
    public static int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
    public static int FLAG_ALT_FOCUSABLE_IM;
    public static int FLAG_BLUR_BEHIND;
    public static int FLAG_DIM_BEHIND;
    public static int FLAG_DISMISS_KEYGUARD;
    public static int FLAG_DITHER;
    public static int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
    public static int FLAG_FORCE_NOT_FULLSCREEN;
    public static int FLAG_FULLSCREEN;
    public static int FLAG_HARDWARE_ACCELERATED;
    public static int FLAG_IGNORE_CHEEK_PRESSES;
    public static int FLAG_KEEP_SCREEN_ON;
    public static int FLAG_LAYOUT_ATTACHED_IN_DECOR;
    public static int FLAG_LAYOUT_INSET_DECOR;
    public static int FLAG_LAYOUT_IN_OVERSCAN;
    public static int FLAG_LAYOUT_IN_SCREEN;
    public static int FLAG_LAYOUT_NO_LIMITS;
    public static int FLAG_LOCAL_FOCUS_MODE;
    public static int FLAG_NOT_FOCUSABLE;
    public static int FLAG_NOT_TOUCHABLE;
    public static int FLAG_NOT_TOUCH_MODAL;
    public static int FLAG_SCALED;
    public static int FLAG_SECURE;
    public static int FLAG_SHOW_WALLPAPER;
    public static int FLAG_SHOW_WHEN_LOCKED;
    public static int FLAG_SLIPPERY;
    public static int FLAG_SPLIT_TOUCH;
    public static int FLAG_TOUCHABLE_WHEN_WAKING;
    public static int FLAG_TRANSLUCENT_NAVIGATION;
    public static int FLAG_TRANSLUCENT_STATUS;
    public static int FLAG_TURN_SCREEN_ON;
    public static int FLAG_WATCH_OUTSIDE_TOUCH;
    public static int FORMAT_CHANGED;
    public static int INPUT_FEATURES_CHANGED;
    public static int INPUT_FEATURE_DISABLE_POINTER_GESTURES;
    public static int INPUT_FEATURE_DISABLE_USER_ACTIVITY;
    public static int INPUT_FEATURE_NO_INPUT_CHANNEL;
    public static int INVALID_WINDOW_TYPE;
    public static int LAST_APPLICATION_WINDOW;
    public static int LAST_SUB_WINDOW;
    public static int LAST_SYSTEM_WINDOW;
    public static int LAYOUT_CHANGED;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
    public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    public static int MEMORY_TYPE_CHANGED;
    public static int MEMORY_TYPE_GPU;
    public static int MEMORY_TYPE_HARDWARE;
    public static int MEMORY_TYPE_NORMAL;
    public static int MEMORY_TYPE_PUSH_BUFFERS;
    public static int NEEDS_MENU_KEY_CHANGED;
    public static int NEEDS_MENU_SET_FALSE;
    public static int NEEDS_MENU_SET_TRUE;
    public static int NEEDS_MENU_UNSET;
    public static int PREFERRED_DISPLAY_MODE_ID;
    public static int PREFERRED_REFRESH_RATE_CHANGED;
    public static int PRIVATE_FLAGS_CHANGED;
    public static int PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
    public static int PRIVATE_FLAG_COMPATIBLE_WINDOW;
    public static int PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS;
    public static int PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
    public static int PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
    public static int PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
    public static int PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
    public static int PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
    public static int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
    public static int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR;
    public static int PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
    public static int PRIVATE_FLAG_IS_SCREEN_DECOR;
    public static int PRIVATE_FLAG_KEYGUARD;
    public static int PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
    public static int PRIVATE_FLAG_NO_MOVE_ANIMATION;
    public static int PRIVATE_FLAG_PRESERVE_GEOMETRY;
    public static int PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
    public static int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
    public static int PRIVATE_FLAG_SYSTEM_ERROR;
    public static int PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS;
    public static int PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
    public static int ROTATION_ANIMATION_CHANGED;
    public static int ROTATION_ANIMATION_CROSSFADE;
    public static int ROTATION_ANIMATION_JUMPCUT;
    public static int ROTATION_ANIMATION_ROTATE;
    public static int ROTATION_ANIMATION_SEAMLESS;
    public static int ROTATION_ANIMATION_UNSPECIFIED;
    public static int SCREEN_BRIGHTNESS_CHANGED;
    public static int SCREEN_ORIENTATION_CHANGED;
    public static int SOFT_INPUT_ADJUST_NOTHING;
    public static int SOFT_INPUT_ADJUST_PAN;
    public static int SOFT_INPUT_ADJUST_RESIZE;
    public static int SOFT_INPUT_ADJUST_UNSPECIFIED;
    public static int SOFT_INPUT_IS_FORWARD_NAVIGATION;
    public static int SOFT_INPUT_MASK_ADJUST;
    public static int SOFT_INPUT_MASK_STATE;
    public static int SOFT_INPUT_MODE_CHANGED;
    public static int SOFT_INPUT_STATE_ALWAYS_HIDDEN;
    public static int SOFT_INPUT_STATE_ALWAYS_VISIBLE;
    public static int SOFT_INPUT_STATE_HIDDEN;
    public static int SOFT_INPUT_STATE_UNCHANGED;
    public static int SOFT_INPUT_STATE_UNSPECIFIED;
    public static int SOFT_INPUT_STATE_VISIBLE;
    public static int SURFACE_INSETS_CHANGED;
    public static int SYSTEM_UI_LISTENER_CHANGED;
    public static int SYSTEM_UI_VISIBILITY_CHANGED;
    public static int TITLE_CHANGED;
    public static int TRANSLUCENT_FLAGS_CHANGED;
    public static int TYPE_ACCESSIBILITY_OVERLAY;
    public static int TYPE_APPLICATION;
    public static int TYPE_APPLICATION_ABOVE_SUB_PANEL;
    public static int TYPE_APPLICATION_ATTACHED_DIALOG;
    public static int TYPE_APPLICATION_MEDIA;
    public static int TYPE_APPLICATION_MEDIA_OVERLAY;
    public static int TYPE_APPLICATION_OVERLAY;
    public static int TYPE_APPLICATION_PANEL;
    public static int TYPE_APPLICATION_STARTING;
    public static int TYPE_APPLICATION_SUB_PANEL;
    public static int TYPE_BASE_APPLICATION;
    public static int TYPE_BOOT_PROGRESS;
    public static int TYPE_CHANGED;
    public static int TYPE_DISPLAY_OVERLAY;
    public static int TYPE_DOCK_DIVIDER;
    public static int TYPE_DRAG;
    public static int TYPE_DRAWN_APPLICATION;
    public static int TYPE_DREAM;
    public static int TYPE_INPUT_CONSUMER;
    public static int TYPE_INPUT_METHOD;
    public static int TYPE_INPUT_METHOD_DIALOG;
    public static int TYPE_KEYGUARD;
    public static int TYPE_KEYGUARD_DIALOG;
    public static int TYPE_MAGNIFICATION_OVERLAY;
    public static int TYPE_NAVIGATION_BAR;
    public static int TYPE_NAVIGATION_BAR_PANEL;
    public static int TYPE_PHONE;
    public static int TYPE_POINTER;
    public static int TYPE_PRESENTATION;
    public static int TYPE_PRIORITY_PHONE;
    public static int TYPE_PRIVATE_PRESENTATION;
    public static int TYPE_QS_DIALOG;
    public static int TYPE_SCREENSHOT;
    public static int TYPE_SEARCH_BAR;
    public static int TYPE_SECURE_SYSTEM_OVERLAY;
    public static int TYPE_STATUS_BAR;
    public static int TYPE_STATUS_BAR_PANEL;
    public static int TYPE_STATUS_BAR_SUB_PANEL;
    public static int TYPE_SYSTEM_ALERT;
    public static int TYPE_SYSTEM_DIALOG;
    public static int TYPE_SYSTEM_ERROR;
    public static int TYPE_SYSTEM_OVERLAY;
    public static int TYPE_TOAST;
    public static int TYPE_VOICE_INTERACTION;
    public static int TYPE_VOICE_INTERACTION_STARTING;
    public static int TYPE_VOLUME_OVERLAY;
    public static int TYPE_WALLPAPER;
    public static int USER_ACTIVITY_TIMEOUT_CHANGED;
    public long accessibilityIdOfAnchor;
    public java.lang.CharSequence accessibilityTitle;
    public float alpha;
    public float buttonBrightness;
    public float dimAmount;
    public int flags;
    public int format;
    public int gravity;
    public boolean hasManualSurfaceInsets;
    public boolean hasSystemUiListeners;
    public long hideTimeoutMilliseconds;
    public float horizontalMargin;
    public float horizontalWeight;
    public int inputFeatures;
    public int layoutInDisplayCutoutMode;
    public int memoryType;
    public int needsMenuKey;
    public java.lang.String packageName;
    public int preferredDisplayModeId;
    public float preferredRefreshRate;
    public boolean preservePreviousSurfaceInsets;
    public int privateFlags;
    public int rotationAnimation;
    public float screenBrightness;
    public int screenOrientation;
    public int softInputMode;
    public int subtreeSystemUiVisibility;
    public android.graphics.Rect surfaceInsets;
    public int systemUiVisibility;
    public android.os.IBinder token;
    public int type;
    public long userActivityTimeout;
    public float verticalMargin;
    public float verticalWeight;
    public int windowAnimations;
    public int x;
    public int y;
}

-keep class android.view.accessibility.AccessibilityEvent {

    public void appendRecord(android.view.accessibility.AccessibilityRecord);
    protected void clear();
    public int describeContents();
    public static java.lang.String eventTypeToString(int);
    public int getAction();
    public int getContentChangeTypes();
    public long getEventTime();
    public int getEventType();
    public int getMovementGranularity();
    public java.lang.CharSequence getPackageName();
    public android.view.accessibility.AccessibilityRecord getRecord(int);
    public int getRecordCount();
    public int getWindowChanges();
    public void initFromParcel(android.os.Parcel);
    public static android.view.accessibility.AccessibilityEvent obtain(int);
    public static android.view.accessibility.AccessibilityEvent obtain(android.view.accessibility.AccessibilityEvent);
    public static android.view.accessibility.AccessibilityEvent obtain();
    public static android.view.accessibility.AccessibilityEvent obtainWindowsChangedEvent(int, int);
    public void recycle();
    public void setAction(int);
    public void setContentChangeTypes(int);
    public void setEventTime(long);
    public void setEventType(int);
    public void setMovementGranularity(int);
    public void setPackageName(java.lang.CharSequence);
    public void setSealed(boolean);
    public void setWindowChanges(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION;
    public static int CONTENT_CHANGE_TYPE_PANE_APPEARED;
    public static int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED;
    public static int CONTENT_CHANGE_TYPE_PANE_TITLE;
    public static int CONTENT_CHANGE_TYPE_SUBTREE;
    public static int CONTENT_CHANGE_TYPE_TEXT;
    public static int CONTENT_CHANGE_TYPE_UNDEFINED;
    public static android.os.Parcelable$Creator CREATOR;
    public static boolean DEBUG_ORIGIN;
    public static int INVALID_POSITION;
    public static int MAX_TEXT_LENGTH;
    public static int TYPES_ALL_MASK;
    public static int TYPE_ANNOUNCEMENT;
    public static int TYPE_ASSIST_READING_CONTEXT;
    public static int TYPE_GESTURE_DETECTION_END;
    public static int TYPE_GESTURE_DETECTION_START;
    public static int TYPE_NOTIFICATION_STATE_CHANGED;
    public static int TYPE_TOUCH_EXPLORATION_GESTURE_END;
    public static int TYPE_TOUCH_EXPLORATION_GESTURE_START;
    public static int TYPE_TOUCH_INTERACTION_END;
    public static int TYPE_TOUCH_INTERACTION_START;
    public static int TYPE_VIEW_ACCESSIBILITY_FOCUSED;
    public static int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED;
    public static int TYPE_VIEW_CLICKED;
    public static int TYPE_VIEW_CONTEXT_CLICKED;
    public static int TYPE_VIEW_FOCUSED;
    public static int TYPE_VIEW_HOVER_ENTER;
    public static int TYPE_VIEW_HOVER_EXIT;
    public static int TYPE_VIEW_LONG_CLICKED;
    public static int TYPE_VIEW_SCROLLED;
    public static int TYPE_VIEW_SELECTED;
    public static int TYPE_VIEW_TEXT_CHANGED;
    public static int TYPE_VIEW_TEXT_SELECTION_CHANGED;
    public static int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY;
    public static int TYPE_WINDOWS_CHANGED;
    public static int TYPE_WINDOW_CONTENT_CHANGED;
    public static int TYPE_WINDOW_STATE_CHANGED;
    public static int WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED;
    public static int WINDOWS_CHANGE_ACTIVE;
    public static int WINDOWS_CHANGE_ADDED;
    public static int WINDOWS_CHANGE_BOUNDS;
    public static int WINDOWS_CHANGE_CHILDREN;
    public static int WINDOWS_CHANGE_FOCUSED;
    public static int WINDOWS_CHANGE_LAYER;
    public static int WINDOWS_CHANGE_PARENT;
    public static int WINDOWS_CHANGE_PIP;
    public static int WINDOWS_CHANGE_REMOVED;
    public static int WINDOWS_CHANGE_TITLE;
    public java.lang.StackTraceElement[] originStackTrace;
}

-keep class android.view.accessibility.AccessibilityNodeInfo {

    public void addAction(android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction);
    public void addAction(int);
    public void addChild(android.view.View);
    public void addChild(android.view.View, int);
    public void addChildUnchecked(android.view.View);
    public boolean canOpenPopup();
    public int describeContents();
    protected void enforceNotSealed();
    protected void enforceSealed();
    public boolean equals(java.lang.Object);
    public java.util.List findAccessibilityNodeInfosByText(java.lang.String);
    public java.util.List findAccessibilityNodeInfosByViewId(java.lang.String);
    public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    public android.view.accessibility.AccessibilityNodeInfo focusSearch(int);
    public static int getAccessibilityViewId(long);
    public java.util.List getActionList();
    public int getActions();
    public java.util.List getAvailableExtraData();
    public void getBoundsInParent(android.graphics.Rect);
    public void getBoundsInScreen(android.graphics.Rect);
    public android.graphics.Rect getBoundsInScreen();
    public android.view.accessibility.AccessibilityNodeInfo getChild(int);
    public int getChildCount();
    public long getChildId(int);
    public android.util.LongArray getChildNodeIds();
    public java.lang.CharSequence getClassName();
    public android.view.accessibility.AccessibilityNodeInfo$CollectionInfo getCollectionInfo();
    public android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo getCollectionItemInfo();
    public int getConnectionId();
    public java.lang.CharSequence getContentDescription();
    public int getDrawingOrder();
    public java.lang.CharSequence getError();
    public android.os.Bundle getExtras();
    public java.lang.CharSequence getHintText();
    public int getInputType();
    public android.view.accessibility.AccessibilityNodeInfo getLabelFor();
    public android.view.accessibility.AccessibilityNodeInfo getLabeledBy();
    public int getLiveRegion();
    public int getMaxTextLength();
    public int getMovementGranularities();
    public java.lang.CharSequence getOriginalText();
    public java.lang.CharSequence getPackageName();
    public java.lang.CharSequence getPaneTitle();
    public android.view.accessibility.AccessibilityNodeInfo getParent();
    public long getParentNodeId();
    public android.view.accessibility.AccessibilityNodeInfo$RangeInfo getRangeInfo();
    public long getSourceNodeId();
    public java.lang.CharSequence getText();
    public int getTextSelectionEnd();
    public int getTextSelectionStart();
    public java.lang.CharSequence getTooltipText();
    public android.view.accessibility.AccessibilityNodeInfo getTraversalAfter();
    public android.view.accessibility.AccessibilityNodeInfo getTraversalBefore();
    public java.lang.String getViewIdResourceName();
    public static int getVirtualDescendantId(long);
    public android.view.accessibility.AccessibilityWindowInfo getWindow();
    public int getWindowId();
    public boolean hasExtras();
    public int hashCode();
    public static java.lang.String idToString(long);
    public boolean isAccessibilityFocused();
    public boolean isCheckable();
    public boolean isChecked();
    public boolean isClickable();
    public boolean isContentInvalid();
    public boolean isContextClickable();
    public boolean isDismissable();
    public boolean isEditable();
    public boolean isEnabled();
    public boolean isFocusable();
    public boolean isFocused();
    public boolean isHeading();
    public boolean isImportantForAccessibility();
    public boolean isLongClickable();
    public boolean isMultiLine();
    public boolean isPassword();
    public boolean isScreenReaderFocusable();
    public boolean isScrollable();
    public boolean isSealed();
    public boolean isSelected();
    public boolean isShowingHintText();
    public boolean isVisibleToUser();
    public static long makeNodeId(int, int);
    public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View);
    public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View, int);
    public static android.view.accessibility.AccessibilityNodeInfo obtain();
    public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.accessibility.AccessibilityNodeInfo);
    public boolean performAction(int);
    public boolean performAction(int, android.os.Bundle);
    public void recycle();
    public boolean refresh(android.os.Bundle, boolean);
    public boolean refresh();
    public boolean refreshWithExtraData(java.lang.String, android.os.Bundle);
    public void removeAction(int);
    public boolean removeAction(android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction);
    public void removeAllActions();
    public boolean removeChild(android.view.View);
    public boolean removeChild(android.view.View, int);
    public void setAccessibilityFocused(boolean);
    public void setAvailableExtraData(java.util.List);
    public void setBoundsInParent(android.graphics.Rect);
    public void setBoundsInScreen(android.graphics.Rect);
    public void setCanOpenPopup(boolean);
    public void setCheckable(boolean);
    public void setChecked(boolean);
    public void setClassName(java.lang.CharSequence);
    public void setClickable(boolean);
    public void setCollectionInfo(android.view.accessibility.AccessibilityNodeInfo$CollectionInfo);
    public void setCollectionItemInfo(android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo);
    public void setConnectionId(int);
    public void setContentDescription(java.lang.CharSequence);
    public void setContentInvalid(boolean);
    public void setContextClickable(boolean);
    public void setDismissable(boolean);
    public void setDrawingOrder(int);
    public void setEditable(boolean);
    public void setEnabled(boolean);
    public void setError(java.lang.CharSequence);
    public void setFocusable(boolean);
    public void setFocused(boolean);
    public void setHeading(boolean);
    public void setHintText(java.lang.CharSequence);
    public void setImportantForAccessibility(boolean);
    public void setInputType(int);
    public void setLabelFor(android.view.View);
    public void setLabelFor(android.view.View, int);
    public void setLabeledBy(android.view.View);
    public void setLabeledBy(android.view.View, int);
    public void setLiveRegion(int);
    public void setLongClickable(boolean);
    public void setMaxTextLength(int);
    public void setMovementGranularities(int);
    public void setMultiLine(boolean);
    public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
    public void setPackageName(java.lang.CharSequence);
    public void setPaneTitle(java.lang.CharSequence);
    public void setParent(android.view.View);
    public void setParent(android.view.View, int);
    public void setPassword(boolean);
    public void setRangeInfo(android.view.accessibility.AccessibilityNodeInfo$RangeInfo);
    public void setScreenReaderFocusable(boolean);
    public void setScrollable(boolean);
    public void setSealed(boolean);
    public void setSelected(boolean);
    public void setShowingHintText(boolean);
    public void setSource(android.view.View);
    public void setSource(android.view.View, int);
    public void setSourceNodeId(long, int);
    public void setText(java.lang.CharSequence);
    public void setTextSelection(int, int);
    public void setTooltipText(java.lang.CharSequence);
    public void setTraversalAfter(android.view.View);
    public void setTraversalAfter(android.view.View, int);
    public void setTraversalBefore(android.view.View);
    public void setTraversalBefore(android.view.View, int);
    public void setViewIdResourceName(java.lang.String);
    public void setVisibleToUser(boolean);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);
    public void writeToParcelNoRecycle(android.os.Parcel, int);


    public static int ACTION_ACCESSIBILITY_FOCUS;
    public static java.lang.String ACTION_ARGUMENT_ACCESSIBLE_CLICKABLE_SPAN;
    public static java.lang.String ACTION_ARGUMENT_COLUMN_INT;
    public static java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN;
    public static java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING;
    public static java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT;
    public static java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X;
    public static java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y;
    public static java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE;
    public static java.lang.String ACTION_ARGUMENT_ROW_INT;
    public static java.lang.String ACTION_ARGUMENT_SELECTION_END_INT;
    public static java.lang.String ACTION_ARGUMENT_SELECTION_START_INT;
    public static java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE;
    public static int ACTION_CLEAR_ACCESSIBILITY_FOCUS;
    public static int ACTION_CLEAR_FOCUS;
    public static int ACTION_CLEAR_SELECTION;
    public static int ACTION_CLICK;
    public static int ACTION_COLLAPSE;
    public static int ACTION_COPY;
    public static int ACTION_CUT;
    public static int ACTION_DISMISS;
    public static int ACTION_EXPAND;
    public static int ACTION_FOCUS;
    public static int ACTION_LONG_CLICK;
    public static int ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
    public static int ACTION_NEXT_HTML_ELEMENT;
    public static int ACTION_PASTE;
    public static int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
    public static int ACTION_PREVIOUS_HTML_ELEMENT;
    public static int ACTION_SCROLL_BACKWARD;
    public static int ACTION_SCROLL_FORWARD;
    public static int ACTION_SELECT;
    public static int ACTION_SET_SELECTION;
    public static int ACTION_SET_TEXT;
    public static android.os.Parcelable$Creator CREATOR;
    public static java.lang.String EXTRA_DATA_REQUESTED_KEY;
    public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH;
    public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX;
    public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY;
    public static int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    public static int FLAG_PREFETCH_DESCENDANTS;
    public static int FLAG_PREFETCH_PREDECESSORS;
    public static int FLAG_PREFETCH_SIBLINGS;
    public static int FLAG_REPORT_VIEW_IDS;
    public static int FOCUS_ACCESSIBILITY;
    public static int FOCUS_INPUT;
    public static int LAST_LEGACY_STANDARD_ACTION;
    public static int MOVEMENT_GRANULARITY_CHARACTER;
    public static int MOVEMENT_GRANULARITY_LINE;
    public static int MOVEMENT_GRANULARITY_PAGE;
    public static int MOVEMENT_GRANULARITY_PARAGRAPH;
    public static int MOVEMENT_GRANULARITY_WORD;
    public static int ROOT_ITEM_ID;
    public static long ROOT_NODE_ID;
    public static int UNDEFINED_CONNECTION_ID;
    public static int UNDEFINED_ITEM_ID;
    public static long UNDEFINED_NODE_ID;
    public static int UNDEFINED_SELECTION_INDEX;
}

-keep class android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction {
    <init>(int, java.lang.CharSequence);

    public boolean equals(java.lang.Object);
    public int getId();
    public java.lang.CharSequence getLabel();
    public int hashCode();
    public java.lang.String toString();


    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_ACCESSIBILITY_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_ACCESSIBILITY_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_SELECTION;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLICK;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_COLLAPSE;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CONTEXT_CLICK;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_COPY;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CUT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_DISMISS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_EXPAND;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_FOCUS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_HIDE_TOOLTIP;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_LONG_CLICK;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_MOVE_WINDOW;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_NEXT_HTML_ELEMENT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PASTE;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PREVIOUS_HTML_ELEMENT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_BACKWARD;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_DOWN;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_FORWARD;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_LEFT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_RIGHT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_TO_POSITION;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_UP;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SELECT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_PROGRESS;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_SELECTION;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_TEXT;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SHOW_ON_SCREEN;
    public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SHOW_TOOLTIP;
    public long mSerializationFlag;
    public static android.util.ArraySet sStandardActions;
}

-keep class android.view.accessibility.AccessibilityNodeInfo$CollectionInfo {

    public int getColumnCount();
    public int getRowCount();
    public int getSelectionMode();
    public boolean isHierarchical();
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(android.view.accessibility.AccessibilityNodeInfo$CollectionInfo);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(int, int, boolean);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(int, int, boolean, int);


    public static int SELECTION_MODE_MULTIPLE;
    public static int SELECTION_MODE_NONE;
    public static int SELECTION_MODE_SINGLE;
}

-keep class android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo {

    public int getColumnIndex();
    public int getColumnSpan();
    public int getRowIndex();
    public int getRowSpan();
    public boolean isHeading();
    public boolean isSelected();
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(int, int, int, int, boolean);
    public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(int, int, int, int, boolean, boolean);


}

-keep class android.view.accessibility.AccessibilityNodeInfo$RangeInfo {

    public float getCurrent();
    public float getMax();
    public float getMin();
    public int getType();
    public static android.view.accessibility.AccessibilityNodeInfo$RangeInfo obtain(android.view.accessibility.AccessibilityNodeInfo$RangeInfo);
    public static android.view.accessibility.AccessibilityNodeInfo$RangeInfo obtain(int, float, float, float);


    public static int RANGE_TYPE_FLOAT;
    public static int RANGE_TYPE_INT;
    public static int RANGE_TYPE_PERCENT;
}

-keep class android.view.accessibility.AccessibilityNodeProvider {
    <init>();

    public void addExtraDataToAccessibilityNodeInfo(int, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
    public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
    public java.util.List findAccessibilityNodeInfosByText(java.lang.String, int);
    public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    public boolean performAction(int, int, android.os.Bundle);


    public static int HOST_VIEW_ID;
}

-keep class android.view.accessibility.AccessibilityRecord {

    public int getAddedCount();
    public java.lang.CharSequence getBeforeText();
    public java.lang.CharSequence getClassName();
    public java.lang.CharSequence getContentDescription();
    public int getCurrentItemIndex();
    public int getFromIndex();
    public int getItemCount();
    public int getMaxScrollX();
    public int getMaxScrollY();
    public android.os.Parcelable getParcelableData();
    public int getRemovedCount();
    public int getScrollDeltaX();
    public int getScrollDeltaY();
    public int getScrollX();
    public int getScrollY();
    public android.view.accessibility.AccessibilityNodeInfo getSource();
    public long getSourceNodeId();
    public java.util.List getText();
    public int getToIndex();
    public int getWindowId();
    public boolean isChecked();
    public boolean isEnabled();
    public boolean isFullScreen();
    public boolean isImportantForAccessibility();
    public boolean isPassword();
    public boolean isScrollable();
    public static android.view.accessibility.AccessibilityRecord obtain(android.view.accessibility.AccessibilityRecord);
    public static android.view.accessibility.AccessibilityRecord obtain();
    public void recycle();
    public void setAddedCount(int);
    public void setBeforeText(java.lang.CharSequence);
    public void setChecked(boolean);
    public void setClassName(java.lang.CharSequence);
    public void setConnectionId(int);
    public void setContentDescription(java.lang.CharSequence);
    public void setCurrentItemIndex(int);
    public void setEnabled(boolean);
    public void setFromIndex(int);
    public void setFullScreen(boolean);
    public void setImportantForAccessibility(boolean);
    public void setItemCount(int);
    public void setMaxScrollX(int);
    public void setMaxScrollY(int);
    public void setParcelableData(android.os.Parcelable);
    public void setPassword(boolean);
    public void setRemovedCount(int);
    public void setScrollDeltaX(int);
    public void setScrollDeltaY(int);
    public void setScrollX(int);
    public void setScrollY(int);
    public void setScrollable(boolean);
    public void setSealed(boolean);
    public void setSource(android.view.View);
    public void setSource(android.view.View, int);
    public void setSourceNodeId(long);
    public void setToIndex(int);
    public void setWindowId(int);
    public java.lang.String toString();


    protected static boolean DEBUG_CONCISE_TOSTRING;
}

-keep class android.view.accessibility.AccessibilityWindowInfo {

    public void addChild(int);
    public boolean changed(android.view.accessibility.AccessibilityWindowInfo);
    public int describeContents();
    public int differenceFrom(android.view.accessibility.AccessibilityWindowInfo);
    public boolean equals(java.lang.Object);
    public android.view.accessibility.AccessibilityNodeInfo getAnchor();
    public void getBoundsInScreen(android.graphics.Rect);
    public android.view.accessibility.AccessibilityWindowInfo getChild(int);
    public int getChildCount();
    public int getId();
    public int getLayer();
    public android.view.accessibility.AccessibilityWindowInfo getParent();
    public android.view.accessibility.AccessibilityNodeInfo getRoot();
    public java.lang.CharSequence getTitle();
    public int getType();
    public int hashCode();
    public boolean isAccessibilityFocused();
    public boolean isActive();
    public boolean isFocused();
    public boolean isInPictureInPictureMode();
    public static android.view.accessibility.AccessibilityWindowInfo obtain();
    public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
    public void recycle();
    public void setAccessibilityFocused(boolean);
    public void setActive(boolean);
    public void setAnchorId(long);
    public void setBoundsInScreen(android.graphics.Rect);
    public void setConnectionId(int);
    public void setFocused(boolean);
    public void setId(int);
    public void setLayer(int);
    public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
    public void setParentId(int);
    public void setPictureInPicture(boolean);
    public void setTitle(java.lang.CharSequence);
    public void setType(int);
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static int ACTIVE_WINDOW_ID;
    public static int ANY_WINDOW_ID;
    public static android.os.Parcelable$Creator CREATOR;
    public static int PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID;
    public static int TYPE_ACCESSIBILITY_OVERLAY;
    public static int TYPE_APPLICATION;
    public static int TYPE_INPUT_METHOD;
    public static int TYPE_SPLIT_SCREEN_DIVIDER;
    public static int TYPE_SYSTEM;
    public static int UNDEFINED_WINDOW_ID;
}

-keep class android.view.accessibility.IAccessibilityInteractionConnectionCallback {

    public abstract void setFindAccessibilityNodeInfoResult(android.view.accessibility.AccessibilityNodeInfo, int);
    public abstract void setFindAccessibilityNodeInfosResult(java.util.List, int);
    public abstract void setPerformAccessibilityActionResult(boolean, int);


}

-keep class android.view.animation.Animation {
    <init>();
    <init>(android.content.Context, android.util.AttributeSet);

    protected void applyTransformation(float, android.view.animation.Transformation);
    public void cancel();
    protected android.view.animation.Animation clone();
    protected java.lang.Object clone();
    public long computeDurationHint();
    public void detach();
    protected void ensureInterpolator();
    protected void finalize();
    public int getBackgroundColor();
    public boolean getDetachWallpaper();
    public long getDuration();
    public boolean getFillAfter();
    public boolean getFillBefore();
    public android.view.animation.Interpolator getInterpolator();
    public void getInvalidateRegion(int, int, int, int, android.graphics.RectF, android.view.animation.Transformation);
    public int getRepeatCount();
    public int getRepeatMode();
    protected float getScaleFactor();
    public boolean getShowWallpaper();
    public long getStartOffset();
    public long getStartTime();
    public boolean getTransformation(long, android.view.animation.Transformation);
    public boolean getTransformation(long, android.view.animation.Transformation, float);
    public int getZAdjustment();
    public boolean hasAlpha();
    public boolean hasEnded();
    public boolean hasStarted();
    public void initialize(int, int, int, int);
    public void initializeInvalidateRegion(int, int, int, int);
    public boolean isFillEnabled();
    public boolean isInitialized();
    public void reset();
    protected float resolveSize(int, float, int, int);
    public void restrictDuration(long);
    public void scaleCurrentDuration(float);
    public void setAnimationListener(android.view.animation.Animation$AnimationListener);
    public void setBackgroundColor(int);
    public void setDetachWallpaper(boolean);
    public void setDuration(long);
    public void setFillAfter(boolean);
    public void setFillBefore(boolean);
    public void setFillEnabled(boolean);
    public void setInterpolator(android.content.Context, int);
    public void setInterpolator(android.view.animation.Interpolator);
    public void setListenerHandler(android.os.Handler);
    public void setRepeatCount(int);
    public void setRepeatMode(int);
    public void setShowWallpaper(boolean);
    public void setStartOffset(long);
    public void setStartTime(long);
    public void setZAdjustment(int);
    public void start();
    public void startNow();
    public boolean willChangeBounds();
    public boolean willChangeTransformationMatrix();


    public static int ABSOLUTE;
    public static int INFINITE;
    public static int RELATIVE_TO_PARENT;
    public static int RELATIVE_TO_SELF;
    public static int RESTART;
    public static int REVERSE;
    public static int START_ON_FIRST_FRAME;
    public static int ZORDER_BOTTOM;
    public static int ZORDER_NORMAL;
    public static int ZORDER_TOP;
}

-keep class android.view.animation.Animation$AnimationListener {

    public abstract void onAnimationEnd(android.view.animation.Animation);
    public abstract void onAnimationRepeat(android.view.animation.Animation);
    public abstract void onAnimationStart(android.view.animation.Animation);


}

-keep class android.view.animation.Interpolator {



}

-keep class android.view.animation.LayoutAnimationController {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.view.animation.Animation);
    <init>(android.view.animation.Animation, float);

    public android.view.animation.Animation getAnimation();
    public android.view.animation.Animation getAnimationForView(android.view.View);
    public float getDelay();
    protected long getDelayForView(android.view.View);
    public android.view.animation.Interpolator getInterpolator();
    public int getOrder();
    protected int getTransformedIndex(android.view.animation.LayoutAnimationController$AnimationParameters);
    public boolean isDone();
    public void setAnimation(android.content.Context, int);
    public void setAnimation(android.view.animation.Animation);
    public void setDelay(float);
    public void setInterpolator(android.content.Context, int);
    public void setInterpolator(android.view.animation.Interpolator);
    public void setOrder(int);
    public void start();
    public boolean willOverlap();


    public static int ORDER_NORMAL;
    public static int ORDER_RANDOM;
    public static int ORDER_REVERSE;
    protected android.view.animation.Animation mAnimation;
    protected android.view.animation.Interpolator mInterpolator;
    protected java.util.Random mRandomizer;
}

-keep class android.view.animation.LayoutAnimationController$AnimationParameters {
    <init>();



    public int count;
    public int index;
}

-keep class android.view.animation.Transformation {
    <init>();

    public void clear();
    public void compose(android.view.animation.Transformation);
    public float getAlpha();
    public android.graphics.Rect getClipRect();
    public android.graphics.Matrix getMatrix();
    public int getTransformationType();
    public boolean hasClipRect();
    public void postCompose(android.view.animation.Transformation);
    public void printShortString(java.io.PrintWriter);
    public void set(android.view.animation.Transformation);
    public void setAlpha(float);
    public void setClipRect(android.graphics.Rect);
    public void setClipRect(int, int, int, int);
    public void setTransformationType(int);
    public java.lang.String toShortString();
    public void toShortString(java.lang.StringBuilder);
    public java.lang.String toString();


    public static int TYPE_ALPHA;
    public static int TYPE_BOTH;
    public static int TYPE_IDENTITY;
    public static int TYPE_MATRIX;
    protected float mAlpha;
    protected android.graphics.Matrix mMatrix;
    protected int mTransformationType;
}

-keep class android.view.autofill.AutofillId {
    <init>(int);
    <init>(android.view.autofill.AutofillId, int);
    <init>(int, int);

    public int describeContents();
    public boolean equals(java.lang.Object);
    public int getViewId();
    public int getVirtualChildId();
    public int hashCode();
    public boolean isVirtual();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.autofill.AutofillManager {
    <init>(android.content.Context, android.view.autofill.IAutoFillManager);

    public void cancel();
    public void commit();
    public void disableAutofillServices();
    public void disableOwnedAutofillServices();
    public void dump(java.lang.String, java.io.PrintWriter);
    public void enableCompatibilityMode();
    public android.content.ComponentName getAutofillServiceComponentName();
    public java.util.List getAvailableFieldClassificationAlgorithms();
    public static int getDatasetIdFromAuthenticationId(int);
    public java.lang.String getDefaultFieldClassificationAlgorithm();
    public android.service.autofill.FillEventHistory getFillEventHistory();
    public android.view.autofill.AutofillId getNextAutofillId();
    public static int getRequestIdFromAuthenticationId(int);
    public android.service.autofill.UserData getUserData();
    public java.lang.String getUserDataId();
    public boolean hasAutofillFeature();
    public boolean hasEnabledAutofillServices();
    public boolean isAutofillSupported();
    public boolean isAutofillUiShowing();
    public boolean isCompatibilityModeEnabledLocked();
    public boolean isEnabled();
    public boolean isFieldClassificationEnabled();
    public static int makeAuthenticationId(int, int);
    public void notifyValueChanged(android.view.View);
    public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
    public void notifyViewClicked(android.view.View);
    public void notifyViewClicked(android.view.View, int);
    public void notifyViewEntered(android.view.View);
    public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
    public void notifyViewExited(android.view.View);
    public void notifyViewExited(android.view.View, int);
    public void notifyViewVisibilityChanged(android.view.View, boolean);
    public void notifyViewVisibilityChanged(android.view.View, int, boolean);
    public void onActivityFinishing();
    public void onAuthenticationResult(int, android.content.Intent, android.view.View);
    public void onCreate(android.os.Bundle);
    public void onInvisibleForAutofill();
    public void onPendingSaveUi(int, android.os.IBinder);
    public void onSaveInstanceState(android.os.Bundle);
    public void onVisibleForAutofill();
    public void registerCallback(android.view.autofill.AutofillManager$AutofillCallback);
    public void requestAutofill(android.view.View);
    public void requestAutofill(android.view.View, int, android.graphics.Rect);
    public void requestHideFillUi();
    public void setUserData(android.service.autofill.UserData);
    public void unregisterCallback(android.view.autofill.AutofillManager$AutofillCallback);


    public static int ACTION_START_SESSION;
    public static int ACTION_VALUE_CHANGED;
    public static int ACTION_VIEW_ENTERED;
    public static int ACTION_VIEW_EXITED;
    public static int AUTHENTICATION_ID_DATASET_ID_UNDEFINED;
    public static java.lang.String EXTRA_ASSIST_STRUCTURE;
    public static java.lang.String EXTRA_AUTHENTICATION_RESULT;
    public static java.lang.String EXTRA_CLIENT_STATE;
    public static java.lang.String EXTRA_RESTORE_SESSION_TOKEN;
    public static int FC_SERVICE_TIMEOUT;
    public static int FLAG_ADD_CLIENT_DEBUG;
    public static int FLAG_ADD_CLIENT_ENABLED;
    public static int FLAG_ADD_CLIENT_VERBOSE;
    public static int NO_SESSION;
    public static int PENDING_UI_OPERATION_CANCEL;
    public static int PENDING_UI_OPERATION_RESTORE;
    public static int SET_STATE_FLAG_DEBUG;
    public static int SET_STATE_FLAG_ENABLED;
    public static int SET_STATE_FLAG_RESET_CLIENT;
    public static int SET_STATE_FLAG_RESET_SESSION;
    public static int SET_STATE_FLAG_VERBOSE;
    public static int STATE_ACTIVE;
    public static int STATE_DISABLED_BY_SERVICE;
    public static int STATE_FINISHED;
    public static int STATE_SHOWING_SAVE_UI;
    public static int STATE_UNKNOWN;
    public static int STATE_UNKNOWN_COMPAT_MODE;
}

-keep class android.view.autofill.AutofillManager$AutofillCallback {
    <init>();

    public void onAutofillEvent(android.view.View, int);
    public void onAutofillEvent(android.view.View, int, int);


    public static int EVENT_INPUT_HIDDEN;
    public static int EVENT_INPUT_SHOWN;
    public static int EVENT_INPUT_UNAVAILABLE;
}

-keep class android.view.autofill.AutofillManager$AutofillClient {

    public abstract void autofillClientAuthenticate(int, android.content.IntentSender, android.content.Intent);
    public abstract void autofillClientDispatchUnhandledKey(android.view.View, android.view.KeyEvent);
    public abstract android.view.View autofillClientFindViewByAccessibilityIdTraversal(int, int);
    public abstract android.view.View autofillClientFindViewByAutofillIdTraversal(android.view.autofill.AutofillId);
    public abstract android.view.View[] autofillClientFindViewsByAutofillIdTraversal(android.view.autofill.AutofillId[]);
    public abstract android.os.IBinder autofillClientGetActivityToken();
    public abstract android.content.ComponentName autofillClientGetComponentName();
    public abstract android.view.autofill.AutofillId autofillClientGetNextAutofillId();
    public abstract boolean[] autofillClientGetViewVisibility(android.view.autofill.AutofillId[]);
    public abstract boolean autofillClientIsCompatibilityModeEnabled();
    public abstract boolean autofillClientIsFillUiShowing();
    public abstract boolean autofillClientIsVisibleForAutofill();
    public abstract boolean autofillClientRequestHideFillUi();
    public abstract boolean autofillClientRequestShowFillUi(android.view.View, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
    public abstract void autofillClientResetableStateAvailable();
    public abstract void autofillClientRunOnUiThread(java.lang.Runnable);
    public abstract boolean isDisablingEnterExitEventForAutofill();


}

-keep class android.view.autofill.AutofillValue {

    public int describeContents();
    public boolean equals(java.lang.Object);
    public static android.view.autofill.AutofillValue forDate(long);
    public static android.view.autofill.AutofillValue forList(int);
    public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
    public static android.view.autofill.AutofillValue forToggle(boolean);
    public long getDateValue();
    public int getListValue();
    public java.lang.CharSequence getTextValue();
    public boolean getToggleValue();
    public int hashCode();
    public boolean isDate();
    public boolean isEmpty();
    public boolean isList();
    public boolean isText();
    public boolean isToggle();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.autofill.IAutoFillManager {

    public abstract int addClient(android.view.autofill.IAutoFillManagerClient, int);
    public abstract void cancelSession(int, int);
    public abstract void disableOwnedAutofillServices(int);
    public abstract void finishSession(int, int);
    public abstract android.content.ComponentName getAutofillServiceComponentName();
    public abstract java.lang.String[] getAvailableFieldClassificationAlgorithms();
    public abstract java.lang.String getDefaultFieldClassificationAlgorithm();
    public abstract android.service.autofill.FillEventHistory getFillEventHistory();
    public abstract android.service.autofill.UserData getUserData();
    public abstract java.lang.String getUserDataId();
    public abstract boolean isFieldClassificationEnabled();
    public abstract boolean isServiceEnabled(int, java.lang.String);
    public abstract boolean isServiceSupported(int);
    public abstract void onPendingSaveUi(int, android.os.IBinder);
    public abstract void removeClient(android.view.autofill.IAutoFillManagerClient, int);
    public abstract boolean restoreSession(int, android.os.IBinder, android.os.IBinder);
    public abstract void setAuthenticationResult(android.os.Bundle, int, int, int);
    public abstract void setAutofillFailure(int, java.util.List, int);
    public abstract void setHasCallback(int, int, boolean);
    public abstract void setUserData(android.service.autofill.UserData);
    public abstract int startSession(android.os.IBinder, android.os.IBinder, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, boolean, int, android.content.ComponentName, boolean);
    public abstract int updateOrRestartSession(android.os.IBinder, android.os.IBinder, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, boolean, int, android.content.ComponentName, int, int, boolean);
    public abstract void updateSession(int, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, int, int);


}

-keep class android.view.autofill.IAutoFillManagerClient {

    public abstract void authenticate(int, int, android.content.IntentSender, android.content.Intent);
    public abstract void autofill(int, java.util.List, java.util.List);
    public abstract void dispatchUnhandledKey(int, android.view.autofill.AutofillId, android.view.KeyEvent);
    public abstract void notifyNoFillUi(int, android.view.autofill.AutofillId, int);
    public abstract void requestHideFillUi(int, android.view.autofill.AutofillId);
    public abstract void requestShowFillUi(int, android.view.autofill.AutofillId, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
    public abstract void setSaveUiState(int, boolean);
    public abstract void setSessionFinished(int);
    public abstract void setState(int);
    public abstract void setTrackedViews(int, android.view.autofill.AutofillId[], boolean, boolean, android.view.autofill.AutofillId[], android.view.autofill.AutofillId);
    public abstract void startIntentSender(android.content.IntentSender, android.content.Intent);


}

-keep class android.view.autofill.IAutofillWindowPresenter {

    public abstract void hide(android.graphics.Rect);
    public abstract void show(android.view.WindowManager$LayoutParams, android.graphics.Rect, boolean, int);


}

-keep class android.view.inputmethod.CompletionInfo {
    <init>(long, int, java.lang.CharSequence);
    <init>(long, int, java.lang.CharSequence, java.lang.CharSequence);

    public int describeContents();
    public long getId();
    public java.lang.CharSequence getLabel();
    public int getPosition();
    public java.lang.CharSequence getText();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.inputmethod.CorrectionInfo {
    <init>(int, java.lang.CharSequence, java.lang.CharSequence);

    public int describeContents();
    public java.lang.CharSequence getNewText();
    public int getOffset();
    public java.lang.CharSequence getOldText();
    public java.lang.String toString();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.view.inputmethod.EditorInfo {
    <init>();

    public int describeContents();
    public void dump(android.util.Printer, java.lang.String);
    public void makeCompatible(int);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int IME_ACTION_DONE;
    public static int IME_ACTION_GO;
    public static int IME_ACTION_NEXT;
    public static int IME_ACTION_NONE;
    public static int IME_ACTION_PREVIOUS;
    public static int IME_ACTION_SEARCH;
    public static int IME_ACTION_SEND;
    public static int IME_ACTION_UNSPECIFIED;
    public static int IME_FLAG_FORCE_ASCII;
    public static int IME_FLAG_NAVIGATE_NEXT;
    public static int IME_FLAG_NAVIGATE_PREVIOUS;
    public static int IME_FLAG_NO_ACCESSORY_ACTION;
    public static int IME_FLAG_NO_ENTER_ACTION;
    public static int IME_FLAG_NO_EXTRACT_UI;
    public static int IME_FLAG_NO_FULLSCREEN;
    public static int IME_FLAG_NO_PERSONALIZED_LEARNING;
    public static int IME_MASK_ACTION;
    public static int IME_NULL;
    public int actionId;
    public java.lang.CharSequence actionLabel;
    public java.lang.String[] contentMimeTypes;
    public android.os.Bundle extras;
    public int fieldId;
    public java.lang.String fieldName;
    public android.os.LocaleList hintLocales;
    public java.lang.CharSequence hintText;
    public int imeOptions;
    public int initialCapsMode;
    public int initialSelEnd;
    public int initialSelStart;
    public int inputType;
    public java.lang.CharSequence label;
    public java.lang.String packageName;
    public java.lang.String privateImeOptions;
}

-keep class android.view.inputmethod.ExtractedText {
    <init>();

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public static int FLAG_SELECTING;
    public static int FLAG_SINGLE_LINE;
    public int flags;
    public java.lang.CharSequence hint;
    public int partialEndOffset;
    public int partialStartOffset;
    public int selectionEnd;
    public int selectionStart;
    public int startOffset;
    public java.lang.CharSequence text;
}

-keep class android.view.inputmethod.ExtractedTextRequest {
    <init>();

    public int describeContents();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public int flags;
    public int hintMaxChars;
    public int hintMaxLines;
    public int token;
}

-keep class android.view.inputmethod.InputConnection {

    public abstract boolean beginBatchEdit();
    public abstract boolean clearMetaKeyStates(int);
    public abstract void closeConnection();
    public abstract boolean commitCompletion(android.view.inputmethod.CompletionInfo);
    public abstract boolean commitContent(android.view.inputmethod.InputContentInfo, int, android.os.Bundle);
    public abstract boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
    public abstract boolean commitText(java.lang.CharSequence, int);
    public abstract boolean deleteSurroundingText(int, int);
    public abstract boolean deleteSurroundingTextInCodePoints(int, int);
    public abstract boolean endBatchEdit();
    public abstract boolean finishComposingText();
    public abstract int getCursorCapsMode(int);
    public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
    public abstract android.os.Handler getHandler();
    public abstract java.lang.CharSequence getSelectedText(int);
    public abstract java.lang.CharSequence getTextAfterCursor(int, int);
    public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
    public abstract boolean performContextMenuAction(int);
    public abstract boolean performEditorAction(int);
    public abstract boolean performPrivateCommand(java.lang.String, android.os.Bundle);
    public abstract boolean reportFullscreenMode(boolean);
    public abstract boolean requestCursorUpdates(int);
    public abstract boolean sendKeyEvent(android.view.KeyEvent);
    public abstract boolean setComposingRegion(int, int);
    public abstract boolean setComposingText(java.lang.CharSequence, int);
    public abstract boolean setSelection(int, int);


    public static int CURSOR_UPDATE_IMMEDIATE;
    public static int CURSOR_UPDATE_MONITOR;
    public static int GET_EXTRACTED_TEXT_MONITOR;
    public static int GET_TEXT_WITH_STYLES;
    public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
}

-keep class android.view.inputmethod.InputContentInfo {
    <init>(android.net.Uri, android.content.ClipDescription);
    <init>(android.net.Uri, android.content.ClipDescription, android.net.Uri);

    public int describeContents();
    public android.net.Uri getContentUri();
    public android.content.ClipDescription getDescription();
    public android.net.Uri getLinkUri();
    public void releasePermission();
    public void requestPermission();
    public boolean validate();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
}

-keep class android.widget.ActionMenuPresenter {
    <init>(android.content.Context);

    public void bindItemView(com.android.internal.view.menu.MenuItemImpl, com.android.internal.view.menu.MenuView$ItemView);
    public boolean dismissPopupMenus();
    public boolean filterLeftoverView(android.view.ViewGroup, int);
    public boolean flagActionItems();
    public android.view.View getItemView(com.android.internal.view.menu.MenuItemImpl, android.view.View, android.view.ViewGroup);
    public com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
    public android.graphics.drawable.Drawable getOverflowIcon();
    public boolean hideOverflowMenu();
    public boolean hideSubMenus();
    public void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
    public boolean isOverflowMenuShowPending();
    public boolean isOverflowMenuShowing();
    public boolean isOverflowReserved();
    public void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onRestoreInstanceState(android.os.Parcelable);
    public android.os.Parcelable onSaveInstanceState();
    public boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
    public void onSubUiVisibilityChanged(boolean);
    public void setExpandedActionViewsExclusive(boolean);
    public void setItemLimit(int);
    public void setMenuView(android.widget.ActionMenuView);
    public void setOverflowIcon(android.graphics.drawable.Drawable);
    public void setReserveOverflow(boolean);
    public void setWidthLimit(int, boolean);
    public boolean shouldIncludeItem(int, com.android.internal.view.menu.MenuItemImpl);
    public boolean showOverflowMenu();
    public void updateMenuView(boolean);


}

-keep class android.widget.ActionMenuView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);

    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    public void dismissPopupMenus();
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    protected android.widget.ActionMenuView$LayoutParams generateDefaultLayoutParams();
    protected android.widget.LinearLayout$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.ActionMenuView$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.widget.ActionMenuView$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    protected android.widget.LinearLayout$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.widget.LinearLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public android.widget.ActionMenuView$LayoutParams generateOverflowButtonLayoutParams();
    public android.view.Menu getMenu();
    public android.graphics.drawable.Drawable getOverflowIcon();
    public int getPopupTheme();
    public int getWindowAnimations();
    protected boolean hasDividerBeforeChildAt(int);
    public boolean hideOverflowMenu();
    public void initialize(com.android.internal.view.menu.MenuBuilder);
    public boolean invokeItem(com.android.internal.view.menu.MenuItemImpl);
    public boolean isOverflowMenuShowPending();
    public boolean isOverflowMenuShowing();
    public boolean isOverflowReserved();
    public void onConfigurationChanged(android.content.res.Configuration);
    public void onDetachedFromWindow();
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public com.android.internal.view.menu.MenuBuilder peekMenu();
    public void setExpandedActionViewsExclusive(boolean);
    public void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
    public void setOnMenuItemClickListener(android.widget.ActionMenuView$OnMenuItemClickListener);
    public void setOverflowIcon(android.graphics.drawable.Drawable);
    public void setOverflowReserved(boolean);
    public void setPopupTheme(int);
    public void setPresenter(android.widget.ActionMenuPresenter);
    public boolean showOverflowMenu();


}

-keep class android.widget.ActionMenuView$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.view.ViewGroup$LayoutParams);
    <init>(android.widget.ActionMenuView$LayoutParams);
    <init>(int, int);
    <init>(int, int, boolean);

    protected void encodeProperties(android.view.ViewHierarchyEncoder);


    public int cellsUsed;
    public boolean expandable;
    public boolean expanded;
    public int extraPixels;
    public boolean isOverflowButton;
    public boolean preventEdgeOffset;
}

-keep class android.widget.ActionMenuView$OnMenuItemClickListener {

    public abstract boolean onMenuItemClick(android.view.MenuItem);


}

-keep class android.widget.Adapter {

    public java.lang.CharSequence[] getAutofillOptions();
    public abstract int getCount();
    public abstract java.lang.Object getItem(int);
    public abstract long getItemId(int);
    public abstract int getItemViewType(int);
    public abstract android.view.View getView(int, android.view.View, android.view.ViewGroup);
    public abstract int getViewTypeCount();
    public abstract boolean hasStableIds();
    public abstract boolean isEmpty();
    public abstract void registerDataSetObserver(android.database.DataSetObserver);
    public abstract void unregisterDataSetObserver(android.database.DataSetObserver);


    public static int IGNORE_ITEM_VIEW_TYPE;
    public static int NO_SELECTION;
}

-keep class android.widget.AdapterView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addView(android.view.View);
    public void addView(android.view.View, int);
    public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
    protected boolean canAnimate();
    public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    protected void dispatchRestoreInstanceState(android.util.SparseArray);
    protected void dispatchSaveInstanceState(android.util.SparseArray);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public java.lang.CharSequence getAccessibilityClassName();
    public abstract android.widget.Adapter getAdapter();
    public int getCount();
    public android.view.View getEmptyView();
    public int getFirstVisiblePosition();
    public java.lang.Object getItemAtPosition(int);
    public long getItemIdAtPosition(int);
    public int getLastVisiblePosition();
    public android.widget.AdapterView$OnItemClickListener getOnItemClickListener();
    public android.widget.AdapterView$OnItemLongClickListener getOnItemLongClickListener();
    public android.widget.AdapterView$OnItemSelectedListener getOnItemSelectedListener();
    public int getPositionForView(android.view.View);
    public java.lang.Object getSelectedItem();
    public long getSelectedItemId();
    public int getSelectedItemPosition();
    public abstract android.view.View getSelectedView();
    protected void onDetachedFromWindow();
    public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    protected void onLayout(boolean, int, int, int, int);
    public void onProvideAutofillStructure(android.view.ViewStructure, int);
    public boolean onRequestSendAccessibilityEventInternal(android.view.View, android.view.accessibility.AccessibilityEvent);
    public boolean performItemClick(android.view.View, int, long);
    public void removeAllViews();
    public void removeView(android.view.View);
    public void removeViewAt(int);
    public abstract void setAdapter(android.widget.Adapter);
    public void setEmptyView(android.view.View);
    public void setFocusable(int);
    public void setFocusableInTouchMode(boolean);
    public void setOnClickListener(android.view.View$OnClickListener);
    public void setOnItemClickListener(android.widget.AdapterView$OnItemClickListener);
    public void setOnItemLongClickListener(android.widget.AdapterView$OnItemLongClickListener);
    public void setOnItemSelectedListener(android.widget.AdapterView$OnItemSelectedListener);
    public abstract void setSelection(int);


    public static int INVALID_POSITION;
    public static long INVALID_ROW_ID;
    public static int ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
    public static int ITEM_VIEW_TYPE_IGNORE;
}

-keep class android.widget.AdapterView$OnItemClickListener {

    public abstract void onItemClick(android.widget.AdapterView, android.view.View, int, long);


}

-keep class android.widget.AdapterView$OnItemLongClickListener {

    public abstract boolean onItemLongClick(android.widget.AdapterView, android.view.View, int, long);


}

-keep class android.widget.AdapterView$OnItemSelectedListener {

    public abstract void onItemSelected(android.widget.AdapterView, android.view.View, int, long);
    public abstract void onNothingSelected(android.widget.AdapterView);


}

-keep class android.widget.FrameLayout {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    protected android.widget.FrameLayout$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.FrameLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public java.lang.CharSequence getAccessibilityClassName();
    public boolean getConsiderGoneChildrenWhenMeasuring();
    public boolean getMeasureAllChildren();
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public void setForegroundGravity(int);
    public void setMeasureAllChildren(boolean);
    public boolean shouldDelayChildPressedState();


}

-keep class android.widget.FrameLayout$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, int);
    <init>(android.view.ViewGroup$LayoutParams);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.widget.FrameLayout$LayoutParams);



    public static int UNSPECIFIED_GRAVITY;
    public int gravity;
}

-keep class android.widget.HorizontalScrollView {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public void addView(android.view.View);
    public void addView(android.view.View, int);
    public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
    public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
    public boolean arrowScroll(int);
    protected int computeHorizontalScrollOffset();
    protected int computeHorizontalScrollRange();
    public void computeScroll();
    protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
    public boolean dispatchKeyEvent(android.view.KeyEvent);
    public void draw(android.graphics.Canvas);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    public boolean executeKeyEvent(android.view.KeyEvent);
    public void fling(int);
    public boolean fullScroll(int);
    public java.lang.CharSequence getAccessibilityClassName();
    protected float getLeftFadingEdgeStrength();
    public int getMaxScrollAmount();
    protected float getRightFadingEdgeStrength();
    public boolean isFillViewport();
    public boolean isSmoothScrollingEnabled();
    protected void measureChild(android.view.View, int, int);
    protected void measureChildWithMargins(android.view.View, int, int, int, int);
    public boolean onGenericMotionEvent(android.view.MotionEvent);
    public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
    public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
    public boolean onInterceptTouchEvent(android.view.MotionEvent);
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    protected void onOverScrolled(int, int, boolean, boolean);
    protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
    protected void onRestoreInstanceState(android.os.Parcelable);
    protected android.os.Parcelable onSaveInstanceState();
    protected void onSizeChanged(int, int, int, int);
    public boolean onTouchEvent(android.view.MotionEvent);
    public boolean pageScroll(int);
    public boolean performAccessibilityActionInternal(int, android.os.Bundle);
    public void requestChildFocus(android.view.View, android.view.View);
    public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    public void requestDisallowInterceptTouchEvent(boolean);
    public void requestLayout();
    public void scrollTo(int, int);
    public void setFillViewport(boolean);
    public void setOverScrollMode(int);
    public void setSmoothScrollingEnabled(boolean);
    public boolean shouldDelayChildPressedState();
    public void smoothScrollBy(int, int);
    public void smoothScrollTo(int, int);


}

-keep class android.widget.LinearLayout {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);
    protected android.widget.LinearLayout$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.LinearLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.widget.LinearLayout$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public java.lang.CharSequence getAccessibilityClassName();
    public int getBaseline();
    public int getBaselineAlignedChildIndex();
    public android.graphics.drawable.Drawable getDividerDrawable();
    public int getDividerPadding();
    public int getDividerWidth();
    public int getGravity();
    public int getOrientation();
    public int getShowDividers();
    public float getWeightSum();
    protected boolean hasDividerBeforeChildAt(int);
    public boolean isBaselineAligned();
    public boolean isMeasureWithLargestChildEnabled();
    protected void onDraw(android.graphics.Canvas);
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    public void onRtlPropertiesChanged(int);
    public void setBaselineAligned(boolean);
    public void setBaselineAlignedChildIndex(int);
    public void setDividerDrawable(android.graphics.drawable.Drawable);
    public void setDividerPadding(int);
    public void setGravity(int);
    public void setHorizontalGravity(int);
    public void setMeasureWithLargestChildEnabled(boolean);
    public void setOrientation(int);
    public void setShowDividers(int);
    public void setVerticalGravity(int);
    public void setWeightSum(float);
    public boolean shouldDelayChildPressedState();


    public static int HORIZONTAL;
    public static int SHOW_DIVIDER_BEGINNING;
    public static int SHOW_DIVIDER_END;
    public static int SHOW_DIVIDER_MIDDLE;
    public static int SHOW_DIVIDER_NONE;
    public static int VERTICAL;
}

-keep class android.widget.LinearLayout$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, float);
    <init>(android.view.ViewGroup$LayoutParams);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.widget.LinearLayout$LayoutParams);

    public java.lang.String debug(java.lang.String);
    protected void encodeProperties(android.view.ViewHierarchyEncoder);


    public int gravity;
    public float weight;
}

-keep class android.widget.RemoteViews {
    <init>(java.lang.String, int);
    <init>(java.lang.String, int, int);
    <init>(android.content.pm.ApplicationInfo, int);
    <init>(android.widget.RemoteViews, android.widget.RemoteViews);
    <init>(android.widget.RemoteViews);
    <init>(android.os.Parcel);

    public void addView(int, android.widget.RemoteViews);
    public void addView(int, android.widget.RemoteViews, int);
    public android.view.View apply(android.content.Context, android.view.ViewGroup);
    public android.view.View apply(android.content.Context, android.view.ViewGroup, android.widget.RemoteViews$OnClickHandler);
    public android.os.CancellationSignal applyAsync(android.content.Context, android.view.ViewGroup, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener);
    public android.os.CancellationSignal applyAsync(android.content.Context, android.view.ViewGroup, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener, android.widget.RemoteViews$OnClickHandler);
    public android.widget.RemoteViews clone();
    public java.lang.Object clone();
    public int describeContents();
    public int estimateMemoryUsage();
    public int getLayoutId();
    public java.lang.String getPackage();
    public int getSequenceNumber();
    public boolean hasSameAppInfo(android.content.pm.ApplicationInfo);
    public boolean isReapplyDisallowed();
    public void mergeRemoteViews(android.widget.RemoteViews);
    public boolean onLoadClass(java.lang.Class);
    public void overrideTextColors(int);
    public boolean prefersAsyncApply();
    public void reapply(android.content.Context, android.view.View);
    public void reapply(android.content.Context, android.view.View, android.widget.RemoteViews$OnClickHandler);
    public android.os.CancellationSignal reapplyAsync(android.content.Context, android.view.View, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener);
    public android.os.CancellationSignal reapplyAsync(android.content.Context, android.view.View, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener, android.widget.RemoteViews$OnClickHandler);
    public void reduceImageSizes(int, int);
    public void removeAllViews(int);
    public void removeAllViewsExceptId(int, int);
    public void setAccessibilityTraversalAfter(int, int);
    public void setAccessibilityTraversalBefore(int, int);
    public void setApplyTheme(int);
    public void setBitmap(int, java.lang.String, android.graphics.Bitmap);
    public void setBoolean(int, java.lang.String, boolean);
    public void setBundle(int, java.lang.String, android.os.Bundle);
    public void setByte(int, java.lang.String, byte);
    public void setChar(int, java.lang.String, char);
    public void setCharSequence(int, java.lang.String, java.lang.CharSequence);
    public void setChronometer(int, long, java.lang.String, boolean);
    public void setChronometerCountDown(int, boolean);
    public void setColorStateList(int, java.lang.String, android.content.res.ColorStateList);
    public void setContentDescription(int, java.lang.CharSequence);
    public void setDisplayedChild(int, int);
    public void setDouble(int, java.lang.String, double);
    public void setDrawableTint(int, boolean, int, android.graphics.PorterDuff$Mode);
    public void setEmptyView(int, int);
    public void setFloat(int, java.lang.String, float);
    public void setIcon(int, java.lang.String, android.graphics.drawable.Icon);
    public void setImageViewBitmap(int, android.graphics.Bitmap);
    public void setImageViewIcon(int, android.graphics.drawable.Icon);
    public void setImageViewResource(int, int);
    public void setImageViewUri(int, android.net.Uri);
    public void setInt(int, java.lang.String, int);
    public void setIntent(int, java.lang.String, android.content.Intent);
    public void setLabelFor(int, int);
    public void setLong(int, java.lang.String, long);
    public void setOnClickFillInIntent(int, android.content.Intent);
    public void setOnClickPendingIntent(int, android.app.PendingIntent);
    public void setPendingIntentTemplate(int, android.app.PendingIntent);
    public void setProgressBackgroundTintList(int, android.content.res.ColorStateList);
    public void setProgressBar(int, int, int, boolean);
    public void setProgressIndeterminateTintList(int, android.content.res.ColorStateList);
    public void setProgressTintList(int, android.content.res.ColorStateList);
    public void setReapplyDisallowed();
    public void setRelativeScrollPosition(int, int);
    public void setRemoteAdapter(int, int, android.content.Intent);
    public void setRemoteAdapter(int, android.content.Intent);
    public void setRemoteAdapter(int, java.util.ArrayList, int);
    public void setRemoteInputs(int, android.app.RemoteInput[]);
    public void setScrollPosition(int, int);
    public void setShort(int, java.lang.String, short);
    public void setString(int, java.lang.String, java.lang.String);
    public void setTextColor(int, int);
    public void setTextColor(int, android.content.res.ColorStateList);
    public void setTextViewCompoundDrawables(int, int, int, int, int);
    public void setTextViewCompoundDrawables(int, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon);
    public void setTextViewCompoundDrawablesRelative(int, int, int, int, int);
    public void setTextViewCompoundDrawablesRelative(int, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon);
    public void setTextViewText(int, java.lang.CharSequence);
    public void setTextViewTextSize(int, int, float);
    public void setUri(int, java.lang.String, android.net.Uri);
    public void setViewLayoutMarginBottomDimen(int, int);
    public void setViewLayoutMarginEnd(int, int);
    public void setViewLayoutMarginEndDimen(int, int);
    public void setViewLayoutWidth(int, int);
    public void setViewPadding(int, int, int, int, int);
    public void setViewVisibility(int, int);
    public void showNext(int);
    public void showPrevious(int);
    public void visitUris(java.util.function.Consumer);
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public android.content.pm.ApplicationInfo mApplication;
}

-keep class android.widget.RemoteViews$OnClickHandler {
    <init>();

    public boolean onClickHandler(android.view.View, android.app.PendingIntent, android.content.Intent);
    public boolean onClickHandler(android.view.View, android.app.PendingIntent, android.content.Intent, int);
    public void setEnterAnimationId(int);


}

-keep class android.widget.RemoteViews$OnViewAppliedListener {

    public abstract void onError(java.lang.Exception);
    public abstract void onViewApplied(android.view.View);


}

-keep class android.widget.SpinnerAdapter {

    public abstract android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);


}

-keep class android.widget.Toolbar {
    <init>(android.content.Context);
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(android.content.Context, android.util.AttributeSet, int);
    <init>(android.content.Context, android.util.AttributeSet, int, int);

    public boolean canShowOverflowMenu();
    protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
    public void collapseActionView();
    public void dismissPopupMenus();
    protected android.widget.Toolbar$LayoutParams generateDefaultLayoutParams();
    protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
    public android.widget.Toolbar$LayoutParams generateLayoutParams(android.util.AttributeSet);
    protected android.widget.Toolbar$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
    public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
    public int getContentInsetEnd();
    public int getContentInsetEndWithActions();
    public int getContentInsetLeft();
    public int getContentInsetRight();
    public int getContentInsetStart();
    public int getContentInsetStartWithNavigation();
    public int getCurrentContentInsetEnd();
    public int getCurrentContentInsetLeft();
    public int getCurrentContentInsetRight();
    public int getCurrentContentInsetStart();
    public android.graphics.drawable.Drawable getLogo();
    public java.lang.CharSequence getLogoDescription();
    public android.view.Menu getMenu();
    public java.lang.CharSequence getNavigationContentDescription();
    public android.graphics.drawable.Drawable getNavigationIcon();
    public android.view.View getNavigationView();
    public android.graphics.drawable.Drawable getOverflowIcon();
    public int getPopupTheme();
    public java.lang.CharSequence getSubtitle();
    public java.lang.CharSequence getTitle();
    public int getTitleMarginBottom();
    public int getTitleMarginEnd();
    public int getTitleMarginStart();
    public int getTitleMarginTop();
    public com.android.internal.widget.DecorToolbar getWrapper();
    public boolean hasExpandedActionView();
    public boolean hideOverflowMenu();
    public void inflateMenu(int);
    public boolean isOverflowMenuShowPending();
    public boolean isOverflowMenuShowing();
    public boolean isTitleTruncated();
    protected void onAttachedToWindow();
    protected void onDetachedFromWindow();
    protected void onLayout(boolean, int, int, int, int);
    protected void onMeasure(int, int);
    protected void onRestoreInstanceState(android.os.Parcelable);
    public void onRtlPropertiesChanged(int);
    protected android.os.Parcelable onSaveInstanceState();
    protected void onSetLayoutParams(android.view.View, android.view.ViewGroup$LayoutParams);
    public boolean onTouchEvent(android.view.MotionEvent);
    public void setCollapsible(boolean);
    public void setContentInsetEndWithActions(int);
    public void setContentInsetStartWithNavigation(int);
    public void setContentInsetsAbsolute(int, int);
    public void setContentInsetsRelative(int, int);
    public void setLogo(int);
    public void setLogo(android.graphics.drawable.Drawable);
    public void setLogoDescription(int);
    public void setLogoDescription(java.lang.CharSequence);
    public void setMenu(com.android.internal.view.menu.MenuBuilder, android.widget.ActionMenuPresenter);
    public void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
    public void setNavigationContentDescription(int);
    public void setNavigationContentDescription(java.lang.CharSequence);
    public void setNavigationIcon(int);
    public void setNavigationIcon(android.graphics.drawable.Drawable);
    public void setNavigationOnClickListener(android.view.View$OnClickListener);
    public void setOnMenuItemClickListener(android.widget.Toolbar$OnMenuItemClickListener);
    public void setOverflowIcon(android.graphics.drawable.Drawable);
    public void setPopupTheme(int);
    public void setSubtitle(int);
    public void setSubtitle(java.lang.CharSequence);
    public void setSubtitleTextAppearance(android.content.Context, int);
    public void setSubtitleTextColor(int);
    public void setTitle(int);
    public void setTitle(java.lang.CharSequence);
    public void setTitleMargin(int, int, int, int);
    public void setTitleMarginBottom(int);
    public void setTitleMarginEnd(int);
    public void setTitleMarginStart(int);
    public void setTitleMarginTop(int);
    public void setTitleTextAppearance(android.content.Context, int);
    public void setTitleTextColor(int);
    public boolean showOverflowMenu();


}

-keep class android.widget.Toolbar$LayoutParams {
    <init>(android.content.Context, android.util.AttributeSet);
    <init>(int, int);
    <init>(int, int, int);
    <init>(int);
    <init>(android.widget.Toolbar$LayoutParams);
    <init>(android.app.ActionBar$LayoutParams);
    <init>(android.view.ViewGroup$MarginLayoutParams);
    <init>(android.view.ViewGroup$LayoutParams);



}

-keep class android.widget.Toolbar$OnMenuItemClickListener {

    public abstract boolean onMenuItemClick(android.view.MenuItem);


}

-keep class com.android.internal.app.IAppOpsActiveCallback {

    public abstract void opActiveChanged(int, int, java.lang.String, boolean);


}

-keep class com.android.internal.app.IAppOpsCallback {

    public abstract void opChanged(int, int, java.lang.String);


}

-keep class com.android.internal.app.IAppOpsService {

    public abstract int checkAudioOperation(int, int, int, java.lang.String);
    public abstract int checkOperation(int, int, java.lang.String);
    public abstract int checkPackage(int, java.lang.String);
    public abstract void finishOperation(android.os.IBinder, int, int, java.lang.String);
    public abstract java.util.List getOpsForPackage(int, java.lang.String, int[]);
    public abstract java.util.List getPackagesForOps(int[]);
    public abstract android.os.IBinder getToken(android.os.IBinder);
    public abstract java.util.List getUidOps(int, int[]);
    public abstract boolean isOperationActive(int, int, java.lang.String);
    public abstract int noteOperation(int, int, java.lang.String);
    public abstract int noteProxyOperation(int, java.lang.String, int, java.lang.String);
    public abstract int permissionToOpCode(java.lang.String);
    public abstract void removeUser(int);
    public abstract void resetAllModes(int, java.lang.String);
    public abstract void setAudioRestriction(int, int, int, int, java.lang.String[]);
    public abstract void setMode(int, int, java.lang.String, int);
    public abstract void setUidMode(int, int, int);
    public abstract void setUserRestriction(int, boolean, android.os.IBinder, int, java.lang.String[]);
    public abstract void setUserRestrictions(android.os.Bundle, android.os.IBinder, int);
    public abstract int startOperation(android.os.IBinder, int, int, java.lang.String, boolean);
    public abstract void startWatchingActive(int[], com.android.internal.app.IAppOpsActiveCallback);
    public abstract void startWatchingMode(int, java.lang.String, com.android.internal.app.IAppOpsCallback);
    public abstract void startWatchingModeWithFlags(int, java.lang.String, int, com.android.internal.app.IAppOpsCallback);
    public abstract void stopWatchingActive(com.android.internal.app.IAppOpsActiveCallback);
    public abstract void stopWatchingMode(com.android.internal.app.IAppOpsCallback);


}

-keep class com.android.internal.app.IVoiceInteractionSessionShowCallback {

    public abstract void onFailed();
    public abstract void onShown();


}

-keep class com.android.internal.app.IVoiceInteractor {

    public abstract com.android.internal.app.IVoiceInteractorRequest startAbortVoice(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startCommand(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, java.lang.String, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startCompleteVoice(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startConfirmation(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
    public abstract com.android.internal.app.IVoiceInteractorRequest startPickOption(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
    public abstract boolean[] supportsCommands(java.lang.String, java.lang.String[]);


}

-keep class com.android.internal.app.IVoiceInteractorCallback {

    public abstract void deliverAbortVoiceResult(com.android.internal.app.IVoiceInteractorRequest, android.os.Bundle);
    public abstract void deliverCancel(com.android.internal.app.IVoiceInteractorRequest);
    public abstract void deliverCommandResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.os.Bundle);
    public abstract void deliverCompleteVoiceResult(com.android.internal.app.IVoiceInteractorRequest, android.os.Bundle);
    public abstract void deliverConfirmationResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.os.Bundle);
    public abstract void deliverPickOptionResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);


}

-keep class com.android.internal.app.IVoiceInteractorRequest {

    public abstract void cancel();


}

-keep class com.android.internal.content.ReferrerIntent {
    <init>(android.content.Intent, java.lang.String);

    public boolean equals(java.lang.Object);
    public int hashCode();
    public void writeToParcel(android.os.Parcel, int);


    public static android.os.Parcelable$Creator CREATOR;
    public java.lang.String mReferrer;
}

-keep class com.android.internal.os.IResultReceiver {

    public abstract void send(int, android.os.Bundle);


}

-keep class com.android.internal.policy.IKeyguardDismissCallback {

    public abstract void onDismissCancelled();
    public abstract void onDismissError();
    public abstract void onDismissSucceeded();


}

-keep class com.android.internal.util.FunctionalUtils {

    public static java.lang.Runnable handleExceptions(com.android.internal.util.FunctionalUtils$ThrowingRunnable, java.util.function.Consumer);
    public static java.util.function.Consumer ignoreRemoteException(com.android.internal.util.FunctionalUtils$RemoteExceptionIgnoringConsumer);
    public static java.util.function.Consumer uncheckExceptions(com.android.internal.util.FunctionalUtils$ThrowingConsumer);


}

-keep class com.android.internal.util.FunctionalUtils$RemoteExceptionIgnoringConsumer {

    public void accept(java.lang.Object);
    public abstract void acceptOrThrow(java.lang.Object);


}

-keep class com.android.internal.util.FunctionalUtils$ThrowingConsumer {

    public void accept(java.lang.Object);
    public abstract void acceptOrThrow(java.lang.Object);


}

-keep class com.android.internal.util.FunctionalUtils$ThrowingRunnable {

    public void run();
    public abstract void runOrThrow();


}

-keep class com.android.internal.util.FunctionalUtils$ThrowingSupplier {

    public abstract java.lang.Object getOrThrow();


}

-keep class com.android.internal.util.IndentingPrintWriter {
    <init>(java.io.Writer, java.lang.String);
    <init>(java.io.Writer, java.lang.String, int);

    public com.android.internal.util.IndentingPrintWriter decreaseIndent();
    public com.android.internal.util.IndentingPrintWriter increaseIndent();
    public com.android.internal.util.IndentingPrintWriter printHexPair(java.lang.String, int);
    public com.android.internal.util.IndentingPrintWriter printPair(java.lang.String, java.lang.Object);
    public com.android.internal.util.IndentingPrintWriter printPair(java.lang.String, java.lang.Object[]);
    public void println();
    public com.android.internal.util.IndentingPrintWriter setIndent(java.lang.String);
    public com.android.internal.util.IndentingPrintWriter setIndent(int);
    public void write(int);
    public void write(java.lang.String, int, int);
    public void write(char[], int, int);


}

-keep class com.android.internal.view.IDragAndDropPermissions {

    public abstract void release();
    public abstract void take(android.os.IBinder);
    public abstract void takeTransient(android.os.IBinder);


}

-keep class com.android.internal.view.menu.BaseMenuPresenter {
    <init>(android.content.Context, int, int);

    protected void addItemView(android.view.View, int);
    public abstract void bindItemView(com.android.internal.view.menu.MenuItemImpl, com.android.internal.view.menu.MenuView$ItemView);
    public boolean collapseItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    public com.android.internal.view.menu.MenuView$ItemView createItemView(android.view.ViewGroup);
    public boolean expandItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    protected boolean filterLeftoverView(android.view.ViewGroup, int);
    public boolean flagActionItems();
    public com.android.internal.view.menu.MenuPresenter$Callback getCallback();
    public int getId();
    public android.view.View getItemView(com.android.internal.view.menu.MenuItemImpl, android.view.View, android.view.ViewGroup);
    public com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
    public void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
    public void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
    public void setCallback(com.android.internal.view.menu.MenuPresenter$Callback);
    public void setId(int);
    public boolean shouldIncludeItem(int, com.android.internal.view.menu.MenuItemImpl);
    public void updateMenuView(boolean);


    protected android.content.Context mContext;
    protected android.view.LayoutInflater mInflater;
    protected com.android.internal.view.menu.MenuBuilder mMenu;
    protected com.android.internal.view.menu.MenuView mMenuView;
    protected android.content.Context mSystemContext;
    protected android.view.LayoutInflater mSystemInflater;
}

-keep class com.android.internal.view.menu.MenuBuilder {
    <init>(android.content.Context);

    public android.view.MenuItem add(java.lang.CharSequence);
    public android.view.MenuItem add(int);
    public android.view.MenuItem add(int, int, int, java.lang.CharSequence);
    public android.view.MenuItem add(int, int, int, int);
    public int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
    public void addMenuPresenter(com.android.internal.view.menu.MenuPresenter);
    public void addMenuPresenter(com.android.internal.view.menu.MenuPresenter, android.content.Context);
    public android.view.SubMenu addSubMenu(java.lang.CharSequence);
    public android.view.SubMenu addSubMenu(int);
    public android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
    public android.view.SubMenu addSubMenu(int, int, int, int);
    public void changeMenuMode();
    public void clear();
    public void clearAll();
    public void clearHeader();
    public void close(boolean);
    public void close();
    public boolean collapseItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public boolean expandItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public int findGroupIndex(int);
    public int findGroupIndex(int, int);
    public android.view.MenuItem findItem(int);
    public int findItemIndex(int);
    public void flagActionItems();
    public java.util.ArrayList getActionItems();
    protected java.lang.String getActionViewStatesKey();
    public android.content.Context getContext();
    public com.android.internal.view.menu.MenuItemImpl getExpandedItem();
    public android.graphics.drawable.Drawable getHeaderIcon();
    public java.lang.CharSequence getHeaderTitle();
    public android.view.View getHeaderView();
    public android.view.MenuItem getItem(int);
    public java.util.ArrayList getNonActionItems();
    public com.android.internal.view.menu.MenuBuilder getRootMenu();
    public java.util.ArrayList getVisibleItems();
    public boolean hasVisibleItems();
    public boolean isGroupDividerEnabled();
    public boolean isShortcutKey(int, android.view.KeyEvent);
    public boolean isShortcutsVisible();
    public void onItemsChanged(boolean);
    public boolean performIdentifierAction(int, int);
    public boolean performItemAction(android.view.MenuItem, int);
    public boolean performItemAction(android.view.MenuItem, com.android.internal.view.menu.MenuPresenter, int);
    public boolean performShortcut(int, android.view.KeyEvent, int);
    public void removeGroup(int);
    public void removeItem(int);
    public void removeItemAt(int);
    public void removeMenuPresenter(com.android.internal.view.menu.MenuPresenter);
    public void restoreActionViewStates(android.os.Bundle);
    public void restorePresenterStates(android.os.Bundle);
    public void saveActionViewStates(android.os.Bundle);
    public void savePresenterStates(android.os.Bundle);
    public void setCallback(com.android.internal.view.menu.MenuBuilder$Callback);
    public void setCurrentMenuInfo(android.view.ContextMenu$ContextMenuInfo);
    public com.android.internal.view.menu.MenuBuilder setDefaultShowAsAction(int);
    public void setGroupCheckable(int, boolean, boolean);
    public void setGroupDividerEnabled(boolean);
    public void setGroupEnabled(int, boolean);
    public void setGroupVisible(int, boolean);
    protected com.android.internal.view.menu.MenuBuilder setHeaderIconInt(android.graphics.drawable.Drawable);
    protected com.android.internal.view.menu.MenuBuilder setHeaderIconInt(int);
    protected com.android.internal.view.menu.MenuBuilder setHeaderTitleInt(java.lang.CharSequence);
    protected com.android.internal.view.menu.MenuBuilder setHeaderTitleInt(int);
    protected com.android.internal.view.menu.MenuBuilder setHeaderViewInt(android.view.View);
    public void setQwertyMode(boolean);
    public void setShortcutsVisible(boolean);
    public int size();
    public void startDispatchingItemsChanged();
    public void stopDispatchingItemsChanged();


}

-keep class com.android.internal.view.menu.MenuBuilder$Callback {

    public abstract boolean onMenuItemSelected(com.android.internal.view.menu.MenuBuilder, android.view.MenuItem);
    public abstract void onMenuModeChange(com.android.internal.view.menu.MenuBuilder);


}

-keep class com.android.internal.view.menu.MenuItemImpl {

    public void actionFormatChanged();
    public boolean collapseActionView();
    public boolean expandActionView();
    public android.view.ActionProvider getActionProvider();
    public android.view.View getActionView();
    public int getAlphabeticModifiers();
    public char getAlphabeticShortcut();
    public java.lang.CharSequence getContentDescription();
    public int getGroupId();
    public android.graphics.drawable.Drawable getIcon();
    public android.content.res.ColorStateList getIconTintList();
    public android.graphics.PorterDuff$Mode getIconTintMode();
    public android.content.Intent getIntent();
    public int getItemId();
    public android.view.ContextMenu$ContextMenuInfo getMenuInfo();
    public int getNumericModifiers();
    public char getNumericShortcut();
    public int getOrder();
    public int getOrdering();
    public android.view.SubMenu getSubMenu();
    public java.lang.CharSequence getTitle();
    public java.lang.CharSequence getTitleCondensed();
    public java.lang.CharSequence getTooltipText();
    public boolean hasCollapsibleActionView();
    public boolean hasSubMenu();
    public boolean invoke();
    public boolean isActionButton();
    public boolean isActionViewExpanded();
    public boolean isCheckable();
    public boolean isChecked();
    public boolean isEnabled();
    public boolean isExclusiveCheckable();
    public boolean isVisible();
    public boolean requestsActionButton();
    public boolean requiresActionButton();
    public boolean requiresOverflow();
    public android.view.MenuItem setActionProvider(android.view.ActionProvider);
    public android.view.MenuItem setActionView(android.view.View);
    public android.view.MenuItem setActionView(int);
    public void setActionViewExpanded(boolean);
    public android.view.MenuItem setAlphabeticShortcut(char);
    public android.view.MenuItem setAlphabeticShortcut(char, int);
    public android.view.MenuItem setCallback(java.lang.Runnable);
    public android.view.MenuItem setCheckable(boolean);
    public android.view.MenuItem setChecked(boolean);
    public android.view.MenuItem setContentDescription(java.lang.CharSequence);
    public android.view.MenuItem setEnabled(boolean);
    public void setExclusiveCheckable(boolean);
    public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    public android.view.MenuItem setIcon(int);
    public android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
    public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff$Mode);
    public android.view.MenuItem setIntent(android.content.Intent);
    public void setIsActionButton(boolean);
    public android.view.MenuItem setNumericShortcut(char);
    public android.view.MenuItem setNumericShortcut(char, int);
    public android.view.MenuItem setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener);
    public android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem$OnMenuItemClickListener);
    public android.view.MenuItem setShortcut(char, char);
    public android.view.MenuItem setShortcut(char, char, int, int);
    public void setShowAsAction(int);
    public android.view.MenuItem setShowAsActionFlags(int);
    public android.view.MenuItem setTitle(java.lang.CharSequence);
    public android.view.MenuItem setTitle(int);
    public android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
    public android.view.MenuItem setTooltipText(java.lang.CharSequence);
    public android.view.MenuItem setVisible(boolean);
    public boolean shouldShowIcon();
    public boolean showsTextAsAction();
    public java.lang.String toString();


}

-keep class com.android.internal.view.menu.MenuPresenter {

    public abstract boolean collapseItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    public abstract boolean expandItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
    public abstract boolean flagActionItems();
    public abstract int getId();
    public abstract com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
    public abstract void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
    public abstract void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public abstract void onRestoreInstanceState(android.os.Parcelable);
    public abstract android.os.Parcelable onSaveInstanceState();
    public abstract boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
    public abstract void setCallback(com.android.internal.view.menu.MenuPresenter$Callback);
    public abstract void updateMenuView(boolean);


}

-keep class com.android.internal.view.menu.MenuPresenter$Callback {

    public abstract void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
    public abstract boolean onOpenSubMenu(com.android.internal.view.menu.MenuBuilder);


}

-keep class com.android.internal.view.menu.MenuView {

    public abstract int getWindowAnimations();
    public abstract void initialize(com.android.internal.view.menu.MenuBuilder);


}

-keep class com.android.internal.view.menu.MenuView$ItemView {

    public abstract com.android.internal.view.menu.MenuItemImpl getItemData();
    public abstract void initialize(com.android.internal.view.menu.MenuItemImpl, int);
    public abstract boolean prefersCondensedTitle();
    public abstract void setCheckable(boolean);
    public abstract void setChecked(boolean);
    public abstract void setEnabled(boolean);
    public abstract void setIcon(android.graphics.drawable.Drawable);
    public abstract void setShortcut(boolean, char);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract boolean showsIcon();


}

-keep class com.android.internal.view.menu.SubMenuBuilder {
    <init>(android.content.Context, com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);

    public boolean collapseItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public boolean expandItemActionView(com.android.internal.view.menu.MenuItemImpl);
    public java.lang.String getActionViewStatesKey();
    public android.view.MenuItem getItem();
    public android.view.Menu getParentMenu();
    public com.android.internal.view.menu.MenuBuilder getRootMenu();
    public boolean isGroupDividerEnabled();
    public boolean isQwertyMode();
    public boolean isShortcutsVisible();
    public void setCallback(com.android.internal.view.menu.MenuBuilder$Callback);
    public void setGroupDividerEnabled(boolean);
    public android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
    public android.view.SubMenu setHeaderIcon(int);
    public android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
    public android.view.SubMenu setHeaderTitle(int);
    public android.view.SubMenu setHeaderView(android.view.View);
    public android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
    public android.view.SubMenu setIcon(int);
    public void setQwertyMode(boolean);
    public void setShortcutsVisible(boolean);


}

-keep class com.android.internal.widget.DecorToolbar {

    public abstract void animateToVisibility(int);
    public abstract boolean canShowOverflowMenu();
    public abstract boolean canSplit();
    public abstract void collapseActionView();
    public abstract void dismissPopupMenus();
    public abstract android.content.Context getContext();
    public abstract android.view.View getCustomView();
    public abstract int getDisplayOptions();
    public abstract int getDropdownItemCount();
    public abstract int getDropdownSelectedPosition();
    public abstract int getHeight();
    public abstract android.view.Menu getMenu();
    public abstract int getNavigationMode();
    public abstract java.lang.CharSequence getSubtitle();
    public abstract java.lang.CharSequence getTitle();
    public abstract android.view.ViewGroup getViewGroup();
    public abstract int getVisibility();
    public abstract boolean hasEmbeddedTabs();
    public abstract boolean hasExpandedActionView();
    public abstract boolean hasIcon();
    public abstract boolean hasLogo();
    public abstract boolean hideOverflowMenu();
    public abstract void initIndeterminateProgress();
    public abstract void initProgress();
    public abstract boolean isOverflowMenuShowPending();
    public abstract boolean isOverflowMenuShowing();
    public abstract boolean isSplit();
    public abstract boolean isTitleTruncated();
    public abstract void restoreHierarchyState(android.util.SparseArray);
    public abstract void saveHierarchyState(android.util.SparseArray);
    public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    public abstract void setCollapsible(boolean);
    public abstract void setCustomView(android.view.View);
    public abstract void setDefaultNavigationContentDescription(int);
    public abstract void setDefaultNavigationIcon(android.graphics.drawable.Drawable);
    public abstract void setDisplayOptions(int);
    public abstract void setDropdownParams(android.widget.SpinnerAdapter, android.widget.AdapterView$OnItemSelectedListener);
    public abstract void setDropdownSelectedPosition(int);
    public abstract void setEmbeddedTabView(com.android.internal.widget.ScrollingTabContainerView);
    public abstract void setHomeButtonEnabled(boolean);
    public abstract void setIcon(int);
    public abstract void setIcon(android.graphics.drawable.Drawable);
    public abstract void setLogo(int);
    public abstract void setLogo(android.graphics.drawable.Drawable);
    public abstract void setMenu(android.view.Menu, com.android.internal.view.menu.MenuPresenter$Callback);
    public abstract void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
    public abstract void setMenuPrepared();
    public abstract void setNavigationContentDescription(java.lang.CharSequence);
    public abstract void setNavigationContentDescription(int);
    public abstract void setNavigationIcon(android.graphics.drawable.Drawable);
    public abstract void setNavigationIcon(int);
    public abstract void setNavigationMode(int);
    public abstract void setSplitToolbar(boolean);
    public abstract void setSplitView(android.view.ViewGroup);
    public abstract void setSplitWhenNarrow(boolean);
    public abstract void setSubtitle(java.lang.CharSequence);
    public abstract void setTitle(java.lang.CharSequence);
    public abstract void setVisibility(int);
    public abstract void setWindowCallback(android.view.Window$Callback);
    public abstract void setWindowTitle(java.lang.CharSequence);
    public abstract android.animation.Animator setupAnimatorToVisibility(int, long);
    public abstract boolean showOverflowMenu();


}

-keep class com.android.internal.widget.ScrollingTabContainerView {
    <init>(android.content.Context);

    public void addTab(android.app.ActionBar$Tab, boolean);
    public void addTab(android.app.ActionBar$Tab, int, boolean);
    public void animateToTab(int);
    public void animateToVisibility(int);
    public void onAttachedToWindow();
    protected void onConfigurationChanged(android.content.res.Configuration);
    public void onDetachedFromWindow();
    public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
    public void onMeasure(int, int);
    public void removeAllTabs();
    public void removeTabAt(int);
    public void setAllowCollapse(boolean);
    public void setContentHeight(int);
    public void setTabSelected(int);
    public void updateTab(int);


    protected com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener mVisAnimListener;
    protected android.animation.Animator mVisibilityAnim;
}

-keep class com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener {
    <init>();

    public void onAnimationCancel(android.animation.Animator);
    public void onAnimationEnd(android.animation.Animator);
    public void onAnimationRepeat(android.animation.Animator);
    public void onAnimationStart(android.animation.Animator);
    public com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener withFinalVisibility(int);


}

-keep class java.io.BufferedWriter {
    <init>(java.io.Writer);
    <init>(java.io.Writer, int);

    public void close();
    public void flush();
    public void newLine();
    public void write(int);
    public void write(char[], int, int);
    public void write(java.lang.String, int, int);


}

-keep class java.io.ByteArrayOutputStream {
    <init>();
    <init>(int);

    public void close();
    public synchronized void reset();
    public synchronized int size();
    public synchronized byte[] toByteArray();
    public synchronized java.lang.String toString();
    public synchronized java.lang.String toString(java.lang.String);
    public synchronized java.lang.String toString(int);
    public synchronized void write(int);
    public synchronized void write(byte[], int, int);
    public synchronized void writeTo(java.io.OutputStream);


    protected byte[] buf;
    protected int count;
}

-keep class java.io.DataOutputStream {
    <init>(java.io.OutputStream);

    public void flush();
    public int size();
    public synchronized void write(int);
    public synchronized void write(byte[], int, int);
    public void writeBoolean(boolean);
    public void writeByte(int);
    public void writeBytes(java.lang.String);
    public void writeChar(int);
    public void writeChars(java.lang.String);
    public void writeDouble(double);
    public void writeFloat(float);
    public void writeInt(int);
    public void writeLong(long);
    public void writeShort(int);
    public void writeUTF(java.lang.String);


    protected int written;
}

-keep class java.io.File {
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.io.File, java.lang.String);
    <init>(java.net.URI);

    public boolean canExecute();
    public boolean canRead();
    public boolean canWrite();
    public int compareTo(java.io.File);
    public int compareTo(java.lang.Object);
    public boolean createNewFile();
    public static java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File);
    public static java.io.File createTempFile(java.lang.String, java.lang.String);
    public boolean delete();
    public void deleteOnExit();
    public boolean equals(java.lang.Object);
    public boolean exists();
    public java.io.File getAbsoluteFile();
    public java.lang.String getAbsolutePath();
    public java.io.File getCanonicalFile();
    public java.lang.String getCanonicalPath();
    public long getFreeSpace();
    public java.lang.String getName();
    public java.lang.String getParent();
    public java.io.File getParentFile();
    public java.lang.String getPath();
    public long getTotalSpace();
    public long getUsableSpace();
    public int hashCode();
    public boolean isAbsolute();
    public boolean isDirectory();
    public boolean isFile();
    public boolean isHidden();
    public long lastModified();
    public long length();
    public java.lang.String[] list();
    public java.lang.String[] list(java.io.FilenameFilter);
    public java.io.File[] listFiles();
    public java.io.File[] listFiles(java.io.FilenameFilter);
    public java.io.File[] listFiles(java.io.FileFilter);
    public static java.io.File[] listRoots();
    public boolean mkdir();
    public boolean mkdirs();
    public boolean renameTo(java.io.File);
    public boolean setExecutable(boolean, boolean);
    public boolean setExecutable(boolean);
    public boolean setLastModified(long);
    public boolean setReadOnly();
    public boolean setReadable(boolean, boolean);
    public boolean setReadable(boolean);
    public boolean setWritable(boolean, boolean);
    public boolean setWritable(boolean);
    public java.nio.file.Path toPath();
    public java.lang.String toString();
    public java.net.URI toURI();
    public java.net.URL toURL();


    public static java.lang.String pathSeparator;
    public static char pathSeparatorChar;
    public static java.lang.String separator;
    public static char separatorChar;
}

-keep class java.io.FileDescriptor {
    <init>();

    public int getInt$();
    public boolean isSocket$();
    public void setInt$(int);
    public void sync();
    public boolean valid();


    public static java.io.FileDescriptor err;
    public static java.io.FileDescriptor in;
    public static java.io.FileDescriptor out;
}

-keep class java.io.FileFilter {

    public abstract boolean accept(java.io.File);


}

-keep class java.io.FileInputStream {
    <init>(java.lang.String);
    <init>(java.io.File);
    <init>(java.io.FileDescriptor);
    <init>(java.io.FileDescriptor, boolean);

    public int available();
    public void close();
    protected void finalize();
    public java.nio.channels.FileChannel getChannel();
    public java.io.FileDescriptor getFD();
    public int read();
    public int read(byte[]);
    public int read(byte[], int, int);
    public long skip(long);


}

-keep class java.io.FileNotFoundException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.io.FileOutputStream {
    <init>(java.lang.String);
    <init>(java.lang.String, boolean);
    <init>(java.io.File);
    <init>(java.io.File, boolean);
    <init>(java.io.FileDescriptor);
    <init>(java.io.FileDescriptor, boolean);

    public void close();
    protected void finalize();
    public java.nio.channels.FileChannel getChannel();
    public java.io.FileDescriptor getFD();
    public void write(int);
    public void write(byte[]);
    public void write(byte[], int, int);


}

-keep class java.io.FilenameFilter {

    public abstract boolean accept(java.io.File, java.lang.String);


}

-keep class java.io.FilterOutputStream {
    <init>(java.io.OutputStream);

    public void close();
    public void flush();
    public void write(int);
    public void write(byte[]);
    public void write(byte[], int, int);


    protected java.io.OutputStream out;
}

-keep class java.io.IOException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.io.InputStream {
    <init>();

    public int available();
    public void close();
    public synchronized void mark(int);
    public boolean markSupported();
    public abstract int read();
    public int read(byte[]);
    public int read(byte[], int, int);
    public synchronized void reset();
    public long skip(long);


}

-keep class java.io.InvalidObjectException {
    <init>(java.lang.String);



}

-keep class java.io.ObjectStreamException {
    <init>(java.lang.String);
    <init>();



}

-keep class java.io.OutputStream {
    <init>();

    public void close();
    public void flush();
    public abstract void write(int);
    public void write(byte[]);
    public void write(byte[], int, int);


}

-keep class java.io.PrintStream {
    <init>(java.io.OutputStream);
    <init>(java.io.OutputStream, boolean);
    <init>(java.io.OutputStream, boolean, java.lang.String);
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.io.File);
    <init>(java.io.File, java.lang.String);

    public java.io.PrintStream append(java.lang.CharSequence);
    public java.io.PrintStream append(java.lang.CharSequence, int, int);
    public java.io.PrintStream append(char);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public boolean checkError();
    protected void clearError();
    public void close();
    public void flush();
    public java.io.PrintStream format(java.lang.String, java.lang.Object[]);
    public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void print(boolean);
    public void print(char);
    public void print(int);
    public void print(long);
    public void print(float);
    public void print(double);
    public void print(char[]);
    public void print(java.lang.String);
    public void print(java.lang.Object);
    public java.io.PrintStream printf(java.lang.String, java.lang.Object[]);
    public java.io.PrintStream printf(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void println();
    public void println(boolean);
    public void println(char);
    public void println(int);
    public void println(long);
    public void println(float);
    public void println(double);
    public void println(char[]);
    public void println(java.lang.String);
    public void println(java.lang.Object);
    protected void setError();
    public void write(int);
    public void write(byte[], int, int);


}

-keep class java.io.PrintWriter {
    <init>(java.io.Writer);
    <init>(java.io.Writer, boolean);
    <init>(java.io.OutputStream);
    <init>(java.io.OutputStream, boolean);
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.io.File);
    <init>(java.io.File, java.lang.String);

    public java.io.PrintWriter append(java.lang.CharSequence);
    public java.io.PrintWriter append(java.lang.CharSequence, int, int);
    public java.io.PrintWriter append(char);
    public java.io.Writer append(char);
    public java.io.Writer append(java.lang.CharSequence, int, int);
    public java.io.Writer append(java.lang.CharSequence);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public boolean checkError();
    protected void clearError();
    public void close();
    public void flush();
    public java.io.PrintWriter format(java.lang.String, java.lang.Object[]);
    public java.io.PrintWriter format(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void print(boolean);
    public void print(char);
    public void print(int);
    public void print(long);
    public void print(float);
    public void print(double);
    public void print(char[]);
    public void print(java.lang.String);
    public void print(java.lang.Object);
    public java.io.PrintWriter printf(java.lang.String, java.lang.Object[]);
    public java.io.PrintWriter printf(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void println();
    public void println(boolean);
    public void println(char);
    public void println(int);
    public void println(long);
    public void println(float);
    public void println(double);
    public void println(char[]);
    public void println(java.lang.String);
    public void println(java.lang.Object);
    protected void setError();
    public void write(int);
    public void write(char[], int, int);
    public void write(char[]);
    public void write(java.lang.String, int, int);
    public void write(java.lang.String);


    protected java.io.Writer out;
}

-keep class java.io.Reader {
    <init>();
    <init>(java.lang.Object);

    public abstract void close();
    public void mark(int);
    public boolean markSupported();
    public int read(java.nio.CharBuffer);
    public int read();
    public int read(char[]);
    public abstract int read(char[], int, int);
    public boolean ready();
    public void reset();
    public long skip(long);


    protected java.lang.Object lock;
}

-keep class java.io.Serializable {



}

-keep class java.io.SyncFailedException {
    <init>(java.lang.String);



}

-keep class java.io.UnsupportedEncodingException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.io.Writer {
    <init>();
    <init>(java.lang.Object);

    public java.io.Writer append(java.lang.CharSequence);
    public java.io.Writer append(java.lang.CharSequence, int, int);
    public java.io.Writer append(char);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public abstract void close();
    public abstract void flush();
    public void write(int);
    public void write(char[]);
    public abstract void write(char[], int, int);
    public void write(java.lang.String);
    public void write(java.lang.String, int, int);


    protected java.lang.Object lock;
}

-keep class java.lang.AbstractStringBuilder {

    public java.lang.AbstractStringBuilder append(java.lang.Object);
    public java.lang.AbstractStringBuilder append(java.lang.String);
    public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder append(char[]);
    public java.lang.AbstractStringBuilder append(char[], int, int);
    public java.lang.AbstractStringBuilder append(boolean);
    public java.lang.AbstractStringBuilder append(char);
    public java.lang.AbstractStringBuilder append(int);
    public java.lang.AbstractStringBuilder append(long);
    public java.lang.AbstractStringBuilder append(float);
    public java.lang.AbstractStringBuilder append(double);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder appendCodePoint(int);
    public int capacity();
    public char charAt(int);
    public int codePointAt(int);
    public int codePointBefore(int);
    public int codePointCount(int, int);
    public java.lang.AbstractStringBuilder delete(int, int);
    public java.lang.AbstractStringBuilder deleteCharAt(int);
    public void ensureCapacity(int);
    public void getChars(int, int, char[], int);
    public int indexOf(java.lang.String);
    public int indexOf(java.lang.String, int);
    public java.lang.AbstractStringBuilder insert(int, char[], int, int);
    public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
    public java.lang.AbstractStringBuilder insert(int, java.lang.String);
    public java.lang.AbstractStringBuilder insert(int, char[]);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder insert(int, boolean);
    public java.lang.AbstractStringBuilder insert(int, char);
    public java.lang.AbstractStringBuilder insert(int, int);
    public java.lang.AbstractStringBuilder insert(int, long);
    public java.lang.AbstractStringBuilder insert(int, float);
    public java.lang.AbstractStringBuilder insert(int, double);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public int offsetByCodePoints(int, int);
    public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
    public java.lang.AbstractStringBuilder reverse();
    public void setCharAt(int, char);
    public void setLength(int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String substring(int);
    public java.lang.String substring(int, int);
    public abstract java.lang.String toString();
    public void trimToSize();


}

-keep class java.lang.Appendable {

    public abstract java.lang.Appendable append(java.lang.CharSequence);
    public abstract java.lang.Appendable append(java.lang.CharSequence, int, int);
    public abstract java.lang.Appendable append(char);


}

-keep class java.lang.Boolean {
    <init>(boolean);
    <init>(java.lang.String);

    public boolean booleanValue();
    public static int compare(boolean, boolean);
    public int compareTo(java.lang.Boolean);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static boolean getBoolean(java.lang.String);
    public int hashCode();
    public static int hashCode(boolean);
    public static boolean logicalAnd(boolean, boolean);
    public static boolean logicalOr(boolean, boolean);
    public static boolean logicalXor(boolean, boolean);
    public static boolean parseBoolean(java.lang.String);
    public static java.lang.String toString(boolean);
    public java.lang.String toString();
    public static java.lang.Boolean valueOf(boolean);
    public static java.lang.Boolean valueOf(java.lang.String);


    public static java.lang.Boolean FALSE;
    public static java.lang.Boolean TRUE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.Byte {
    <init>(byte);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(byte, byte);
    public int compareTo(java.lang.Byte);
    public int compareTo(java.lang.Object);
    public static java.lang.Byte decode(java.lang.String);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public int hashCode();
    public static int hashCode(byte);
    public int intValue();
    public long longValue();
    public static byte parseByte(java.lang.String, int);
    public static byte parseByte(java.lang.String);
    public short shortValue();
    public static java.lang.String toHexString(byte, boolean);
    public static java.lang.String toString(byte);
    public java.lang.String toString();
    public static int toUnsignedInt(byte);
    public static long toUnsignedLong(byte);
    public static java.lang.Byte valueOf(byte);
    public static java.lang.Byte valueOf(java.lang.String, int);
    public static java.lang.Byte valueOf(java.lang.String);


    public static int BYTES;
    public static byte MAX_VALUE;
    public static byte MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.CharSequence {

    public abstract char charAt(int);
    public java.util.stream.IntStream chars();
    public java.util.stream.IntStream codePoints();
    public abstract int length();
    public abstract java.lang.CharSequence subSequence(int, int);
    public abstract java.lang.String toString();


}

-keep class java.lang.Character {
    <init>(char);

    public static int charCount(int);
    public char charValue();
    public static int codePointAt(java.lang.CharSequence, int);
    public static int codePointAt(char[], int);
    public static int codePointAt(char[], int, int);
    public static int codePointBefore(java.lang.CharSequence, int);
    public static int codePointBefore(char[], int);
    public static int codePointBefore(char[], int, int);
    public static int codePointCount(java.lang.CharSequence, int, int);
    public static int codePointCount(char[], int, int);
    public static int compare(char, char);
    public int compareTo(java.lang.Character);
    public int compareTo(java.lang.Object);
    public static int digit(char, int);
    public static int digit(int, int);
    public boolean equals(java.lang.Object);
    public static char forDigit(int, int);
    public static byte getDirectionality(char);
    public static byte getDirectionality(int);
    public static java.lang.String getName(int);
    public static int getNumericValue(char);
    public static int getNumericValue(int);
    public static int getType(char);
    public static int getType(int);
    public int hashCode();
    public static int hashCode(char);
    public static char highSurrogate(int);
    public static boolean isAlphabetic(int);
    public static boolean isBmpCodePoint(int);
    public static boolean isDefined(char);
    public static boolean isDefined(int);
    public static boolean isDigit(char);
    public static boolean isDigit(int);
    public static boolean isHighSurrogate(char);
    public static boolean isISOControl(char);
    public static boolean isISOControl(int);
    public static boolean isIdentifierIgnorable(char);
    public static boolean isIdentifierIgnorable(int);
    public static boolean isIdeographic(int);
    public static boolean isJavaIdentifierPart(char);
    public static boolean isJavaIdentifierPart(int);
    public static boolean isJavaIdentifierStart(char);
    public static boolean isJavaIdentifierStart(int);
    public static boolean isJavaLetter(char);
    public static boolean isJavaLetterOrDigit(char);
    public static boolean isLetter(char);
    public static boolean isLetter(int);
    public static boolean isLetterOrDigit(char);
    public static boolean isLetterOrDigit(int);
    public static boolean isLowSurrogate(char);
    public static boolean isLowerCase(char);
    public static boolean isLowerCase(int);
    public static boolean isMirrored(char);
    public static boolean isMirrored(int);
    public static boolean isSpace(char);
    public static boolean isSpaceChar(char);
    public static boolean isSpaceChar(int);
    public static boolean isSupplementaryCodePoint(int);
    public static boolean isSurrogate(char);
    public static boolean isSurrogatePair(char, char);
    public static boolean isTitleCase(char);
    public static boolean isTitleCase(int);
    public static boolean isUnicodeIdentifierPart(char);
    public static boolean isUnicodeIdentifierPart(int);
    public static boolean isUnicodeIdentifierStart(char);
    public static boolean isUnicodeIdentifierStart(int);
    public static boolean isUpperCase(char);
    public static boolean isUpperCase(int);
    public static boolean isValidCodePoint(int);
    public static boolean isWhitespace(char);
    public static boolean isWhitespace(int);
    public static char lowSurrogate(int);
    public static int offsetByCodePoints(java.lang.CharSequence, int, int);
    public static int offsetByCodePoints(char[], int, int, int, int);
    public static char reverseBytes(char);
    public static int toChars(int, char[], int);
    public static char[] toChars(int);
    public static int toCodePoint(char, char);
    public static char toLowerCase(char);
    public static int toLowerCase(int);
    public java.lang.String toString();
    public static java.lang.String toString(char);
    public static char toTitleCase(char);
    public static int toTitleCase(int);
    public static char toUpperCase(char);
    public static int toUpperCase(int);
    public static java.lang.Character valueOf(char);


    public static int BYTES;
    public static byte COMBINING_SPACING_MARK;
    public static byte CONNECTOR_PUNCTUATION;
    public static byte CONTROL;
    public static byte CURRENCY_SYMBOL;
    public static byte DASH_PUNCTUATION;
    public static byte DECIMAL_DIGIT_NUMBER;
    public static byte DIRECTIONALITY_ARABIC_NUMBER;
    public static byte DIRECTIONALITY_BOUNDARY_NEUTRAL;
    public static byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR;
    public static byte DIRECTIONALITY_EUROPEAN_NUMBER;
    public static byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR;
    public static byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR;
    public static byte DIRECTIONALITY_LEFT_TO_RIGHT;
    public static byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING;
    public static byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE;
    public static byte DIRECTIONALITY_NONSPACING_MARK;
    public static byte DIRECTIONALITY_OTHER_NEUTRALS;
    public static byte DIRECTIONALITY_PARAGRAPH_SEPARATOR;
    public static byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING;
    public static byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE;
    public static byte DIRECTIONALITY_SEGMENT_SEPARATOR;
    public static byte DIRECTIONALITY_UNDEFINED;
    public static byte DIRECTIONALITY_WHITESPACE;
    public static byte ENCLOSING_MARK;
    public static byte END_PUNCTUATION;
    public static byte FINAL_QUOTE_PUNCTUATION;
    public static byte FORMAT;
    public static byte INITIAL_QUOTE_PUNCTUATION;
    public static byte LETTER_NUMBER;
    public static byte LINE_SEPARATOR;
    public static byte LOWERCASE_LETTER;
    public static byte MATH_SYMBOL;
    public static int MAX_CODE_POINT;
    public static char MAX_HIGH_SURROGATE;
    public static char MAX_LOW_SURROGATE;
    public static int MAX_RADIX;
    public static char MAX_SURROGATE;
    public static char MAX_VALUE;
    public static int MIN_CODE_POINT;
    public static char MIN_HIGH_SURROGATE;
    public static char MIN_LOW_SURROGATE;
    public static int MIN_RADIX;
    public static int MIN_SUPPLEMENTARY_CODE_POINT;
    public static char MIN_SURROGATE;
    public static char MIN_VALUE;
    public static byte MODIFIER_LETTER;
    public static byte MODIFIER_SYMBOL;
    public static byte NON_SPACING_MARK;
    public static byte OTHER_LETTER;
    public static byte OTHER_NUMBER;
    public static byte OTHER_PUNCTUATION;
    public static byte OTHER_SYMBOL;
    public static byte PARAGRAPH_SEPARATOR;
    public static byte PRIVATE_USE;
    public static int SIZE;
    public static byte SPACE_SEPARATOR;
    public static byte START_PUNCTUATION;
    public static byte SURROGATE;
    public static byte TITLECASE_LETTER;
    public static java.lang.Class TYPE;
    public static byte UNASSIGNED;
    public static byte UPPERCASE_LETTER;
}

-keep class java.lang.Class {

    public java.lang.Class asSubclass(java.lang.Class);
    public java.lang.Object cast(java.lang.Object);
    public boolean desiredAssertionStatus();
    public static java.lang.Class forName(java.lang.String);
    public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader);
    public int getAccessFlags();
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public java.lang.String getCanonicalName();
    public java.lang.ClassLoader getClassLoader();
    public java.lang.Class[] getClasses();
    public java.lang.Class getComponentType();
    public java.lang.reflect.Constructor getConstructor(java.lang.Class[]);
    public java.lang.reflect.Constructor[] getConstructors();
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class[] getDeclaredClasses();
    public java.lang.reflect.Constructor getDeclaredConstructor(java.lang.Class[]);
    public java.lang.reflect.Constructor[] getDeclaredConstructors();
    public java.lang.reflect.Field getDeclaredField(java.lang.String);
    public java.lang.reflect.Field[] getDeclaredFields();
    public java.lang.reflect.Field[] getDeclaredFieldsUnchecked(boolean);
    public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class[]);
    public java.lang.reflect.Method[] getDeclaredMethods();
    public java.lang.reflect.Method[] getDeclaredMethodsUnchecked(boolean);
    public java.lang.Class getDeclaringClass();
    public java.lang.Class getEnclosingClass();
    public java.lang.reflect.Constructor getEnclosingConstructor();
    public java.lang.reflect.Method getEnclosingMethod();
    public java.lang.Object[] getEnumConstants();
    public java.lang.Object[] getEnumConstantsShared();
    public java.lang.reflect.Field getField(java.lang.String);
    public java.lang.reflect.Field[] getFields();
    public java.lang.reflect.Type[] getGenericInterfaces();
    public java.lang.reflect.Type getGenericSuperclass();
    public java.lang.reflect.Method getInstanceMethod(java.lang.String, java.lang.Class[]);
    public java.lang.Class[] getInterfaces();
    public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class[]);
    public java.lang.reflect.Method[] getMethods();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.Package getPackage();
    public java.lang.String getPackageName$();
    public java.security.ProtectionDomain getProtectionDomain();
    public java.net.URL getResource(java.lang.String);
    public java.io.InputStream getResourceAsStream(java.lang.String);
    public java.lang.Object[] getSigners();
    public java.lang.String getSimpleName();
    public java.lang.Class getSuperclass();
    public java.lang.String getTypeName();
    public synchronized java.lang.reflect.TypeVariable[] getTypeParameters();
    public boolean isAnnotation();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isAnonymousClass();
    public boolean isArray();
    public boolean isAssignableFrom(java.lang.Class);
    public boolean isEnum();
    public boolean isFinalizable();
    public boolean isInstance(java.lang.Object);
    public boolean isInterface();
    public boolean isLocalClass();
    public boolean isMemberClass();
    public boolean isPrimitive();
    public boolean isProxy();
    public boolean isSynthetic();
    public java.lang.Object newInstance();
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.ClassFormatError {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.ClassLoader {
    <init>(java.lang.ClassLoader);
    <init>();

    public void clearAssertionStatus();
    protected java.lang.Class defineClass(byte[], int, int);
    protected java.lang.Class defineClass(java.lang.String, byte[], int, int);
    protected java.lang.Class defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain);
    protected java.lang.Class defineClass(java.lang.String, java.nio.ByteBuffer, java.security.ProtectionDomain);
    protected java.lang.Package definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL);
    protected java.lang.Class findClass(java.lang.String);
    protected java.lang.String findLibrary(java.lang.String);
    protected java.lang.Class findLoadedClass(java.lang.String);
    protected java.net.URL findResource(java.lang.String);
    protected java.util.Enumeration findResources(java.lang.String);
    protected java.lang.Class findSystemClass(java.lang.String);
    protected java.lang.Package getPackage(java.lang.String);
    protected java.lang.Package[] getPackages();
    public java.lang.ClassLoader getParent();
    public java.net.URL getResource(java.lang.String);
    public java.io.InputStream getResourceAsStream(java.lang.String);
    public java.util.Enumeration getResources(java.lang.String);
    public static java.lang.ClassLoader getSystemClassLoader();
    public static java.net.URL getSystemResource(java.lang.String);
    public static java.io.InputStream getSystemResourceAsStream(java.lang.String);
    public static java.util.Enumeration getSystemResources(java.lang.String);
    public java.lang.Class loadClass(java.lang.String);
    protected java.lang.Class loadClass(java.lang.String, boolean);
    protected static boolean registerAsParallelCapable();
    protected void resolveClass(java.lang.Class);
    public void setClassAssertionStatus(java.lang.String, boolean);
    public void setDefaultAssertionStatus(boolean);
    public void setPackageAssertionStatus(java.lang.String, boolean);
    protected void setSigners(java.lang.Class, java.lang.Object[]);


    public java.util.Map proxyCache;
}

-keep class java.lang.ClassNotFoundException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);

    public java.lang.Throwable getCause();
    public java.lang.Throwable getException();


}

-keep class java.lang.CloneNotSupportedException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Comparable {

    public abstract int compareTo(java.lang.Object);


}

-keep class java.lang.Double {
    <init>(double);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(double, double);
    public int compareTo(java.lang.Double);
    public int compareTo(java.lang.Object);
    public static long doubleToLongBits(double);
    public static long doubleToRawLongBits(double);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public int hashCode();
    public static int hashCode(double);
    public int intValue();
    public static boolean isFinite(double);
    public static boolean isInfinite(double);
    public boolean isInfinite();
    public static boolean isNaN(double);
    public boolean isNaN();
    public static double longBitsToDouble(long);
    public long longValue();
    public static double max(double, double);
    public static double min(double, double);
    public static double parseDouble(java.lang.String);
    public short shortValue();
    public static double sum(double, double);
    public static java.lang.String toHexString(double);
    public static java.lang.String toString(double);
    public java.lang.String toString();
    public static java.lang.Double valueOf(java.lang.String);
    public static java.lang.Double valueOf(double);


    public static int BYTES;
    public static int MAX_EXPONENT;
    public static double MAX_VALUE;
    public static int MIN_EXPONENT;
    public static double MIN_NORMAL;
    public static double MIN_VALUE;
    public static double NEGATIVE_INFINITY;
    public static double NaN;
    public static double POSITIVE_INFINITY;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.Enum {
    <init>(java.lang.String, int);

    protected java.lang.Object clone();
    public int compareTo(java.lang.Enum);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    protected void finalize();
    public java.lang.Class getDeclaringClass();
    public static java.lang.Enum[] getSharedConstants(java.lang.Class);
    public int hashCode();
    public java.lang.String name();
    public int ordinal();
    public java.lang.String toString();
    public static java.lang.Enum valueOf(java.lang.Class, java.lang.String);


}

-keep class java.lang.Error {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-keep class java.lang.Exception {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-keep class java.lang.Float {
    <init>(float);
    <init>(double);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(float, float);
    public int compareTo(java.lang.Float);
    public int compareTo(java.lang.Object);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public static int floatToIntBits(float);
    public static int floatToRawIntBits(float);
    public float floatValue();
    public int hashCode();
    public static int hashCode(float);
    public static float intBitsToFloat(int);
    public int intValue();
    public static boolean isFinite(float);
    public static boolean isInfinite(float);
    public boolean isInfinite();
    public static boolean isNaN(float);
    public boolean isNaN();
    public long longValue();
    public static float max(float, float);
    public static float min(float, float);
    public static float parseFloat(java.lang.String);
    public short shortValue();
    public static float sum(float, float);
    public static java.lang.String toHexString(float);
    public static java.lang.String toString(float);
    public java.lang.String toString();
    public static java.lang.Float valueOf(java.lang.String);
    public static java.lang.Float valueOf(float);


    public static int BYTES;
    public static int MAX_EXPONENT;
    public static float MAX_VALUE;
    public static int MIN_EXPONENT;
    public static float MIN_NORMAL;
    public static float MIN_VALUE;
    public static float NEGATIVE_INFINITY;
    public static float NaN;
    public static float POSITIVE_INFINITY;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.IllegalAccessException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.IllegalArgumentException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.IllegalStateException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.InstantiationException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Integer {
    <init>(int);
    <init>(java.lang.String);

    public static int bitCount(int);
    public byte byteValue();
    public static int compare(int, int);
    public int compareTo(java.lang.Integer);
    public int compareTo(java.lang.Object);
    public static int compareUnsigned(int, int);
    public static java.lang.Integer decode(java.lang.String);
    public static int divideUnsigned(int, int);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public static java.lang.Integer getInteger(java.lang.String);
    public static java.lang.Integer getInteger(java.lang.String, int);
    public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
    public int hashCode();
    public static int hashCode(int);
    public static int highestOneBit(int);
    public int intValue();
    public long longValue();
    public static int lowestOneBit(int);
    public static int max(int, int);
    public static int min(int, int);
    public static int numberOfLeadingZeros(int);
    public static int numberOfTrailingZeros(int);
    public static int parseInt(java.lang.String, int);
    public static int parseInt(java.lang.String);
    public static int parseUnsignedInt(java.lang.String, int);
    public static int parseUnsignedInt(java.lang.String);
    public static int remainderUnsigned(int, int);
    public static int reverse(int);
    public static int reverseBytes(int);
    public static int rotateLeft(int, int);
    public static int rotateRight(int, int);
    public short shortValue();
    public static int signum(int);
    public static int sum(int, int);
    public static java.lang.String toBinaryString(int);
    public static java.lang.String toHexString(int);
    public static java.lang.String toOctalString(int);
    public static java.lang.String toString(int, int);
    public static java.lang.String toString(int);
    public java.lang.String toString();
    public static long toUnsignedLong(int);
    public static java.lang.String toUnsignedString(int, int);
    public static java.lang.String toUnsignedString(int);
    public static java.lang.Integer valueOf(java.lang.String, int);
    public static java.lang.Integer valueOf(java.lang.String);
    public static java.lang.Integer valueOf(int);


    public static int BYTES;
    public static int MAX_VALUE;
    public static int MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.InterruptedException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Iterable {

    public void forEach(java.util.function.Consumer);
    public abstract java.util.Iterator iterator();
    public java.util.Spliterator spliterator();


}

-keep class java.lang.LinkageError {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);



}

-keep class java.lang.Long {
    <init>(long);
    <init>(java.lang.String);

    public static int bitCount(long);
    public byte byteValue();
    public static int compare(long, long);
    public int compareTo(java.lang.Long);
    public int compareTo(java.lang.Object);
    public static int compareUnsigned(long, long);
    public static java.lang.Long decode(java.lang.String);
    public static long divideUnsigned(long, long);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public static java.lang.Long getLong(java.lang.String);
    public static java.lang.Long getLong(java.lang.String, long);
    public static java.lang.Long getLong(java.lang.String, java.lang.Long);
    public int hashCode();
    public static int hashCode(long);
    public static long highestOneBit(long);
    public int intValue();
    public long longValue();
    public static long lowestOneBit(long);
    public static long max(long, long);
    public static long min(long, long);
    public static int numberOfLeadingZeros(long);
    public static int numberOfTrailingZeros(long);
    public static long parseLong(java.lang.String, int);
    public static long parseLong(java.lang.String);
    public static long parseUnsignedLong(java.lang.String, int);
    public static long parseUnsignedLong(java.lang.String);
    public static long remainderUnsigned(long, long);
    public static long reverse(long);
    public static long reverseBytes(long);
    public static long rotateLeft(long, int);
    public static long rotateRight(long, int);
    public short shortValue();
    public static int signum(long);
    public static long sum(long, long);
    public static java.lang.String toBinaryString(long);
    public static java.lang.String toHexString(long);
    public static java.lang.String toOctalString(long);
    public static java.lang.String toString(long, int);
    public static java.lang.String toString(long);
    public java.lang.String toString();
    public static java.lang.String toUnsignedString(long, int);
    public static java.lang.String toUnsignedString(long);
    public static java.lang.Long valueOf(java.lang.String, int);
    public static java.lang.Long valueOf(java.lang.String);
    public static java.lang.Long valueOf(long);


    public static int BYTES;
    public static long MAX_VALUE;
    public static long MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.NoSuchFieldException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.NoSuchMethodException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Number {
    <init>();

    public byte byteValue();
    public abstract double doubleValue();
    public abstract float floatValue();
    public abstract int intValue();
    public abstract long longValue();
    public short shortValue();


}

-keep class java.lang.NumberFormatException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.lang.Object {
    <init>();

    protected java.lang.Object clone();
    public boolean equals(java.lang.Object);
    protected void finalize();
    public java.lang.Class getClass();
    public int hashCode();
    public void notify();
    public void notifyAll();
    public java.lang.String toString();
    public void wait(long);
    public void wait(long, int);
    public void wait();


}

-keep class java.lang.Package {

    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
    public java.lang.String getImplementationTitle();
    public java.lang.String getImplementationVendor();
    public java.lang.String getImplementationVersion();
    public java.lang.String getName();
    public static java.lang.Package getPackage(java.lang.String);
    public static java.lang.Package[] getPackages();
    public java.lang.String getSpecificationTitle();
    public java.lang.String getSpecificationVendor();
    public java.lang.String getSpecificationVersion();
    public int hashCode();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isCompatibleWith(java.lang.String);
    public boolean isSealed();
    public boolean isSealed(java.net.URL);
    public java.lang.String toString();


}

-keep class java.lang.ReflectiveOperationException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.Runnable {

    public abstract void run();


}

-keep class java.lang.RuntimeException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);



}

-keep class java.lang.SecurityException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.lang.Short {
    <init>(short);
    <init>(java.lang.String);

    public byte byteValue();
    public static int compare(short, short);
    public int compareTo(java.lang.Short);
    public int compareTo(java.lang.Object);
    public static java.lang.Short decode(java.lang.String);
    public double doubleValue();
    public boolean equals(java.lang.Object);
    public float floatValue();
    public int hashCode();
    public static int hashCode(short);
    public int intValue();
    public long longValue();
    public static short parseShort(java.lang.String, int);
    public static short parseShort(java.lang.String);
    public static short reverseBytes(short);
    public short shortValue();
    public static java.lang.String toString(short);
    public java.lang.String toString();
    public static int toUnsignedInt(short);
    public static long toUnsignedLong(short);
    public static java.lang.Short valueOf(java.lang.String, int);
    public static java.lang.Short valueOf(java.lang.String);
    public static java.lang.Short valueOf(short);


    public static int BYTES;
    public static short MAX_VALUE;
    public static short MIN_VALUE;
    public static int SIZE;
    public static java.lang.Class TYPE;
}

-keep class java.lang.StackTraceElement {
    <init>(java.lang.String, java.lang.String, java.lang.String, int);

    public boolean equals(java.lang.Object);
    public java.lang.String getClassName();
    public java.lang.String getFileName();
    public int getLineNumber();
    public java.lang.String getMethodName();
    public int hashCode();
    public boolean isNativeMethod();
    public java.lang.String toString();


}

-keep class java.lang.String {
    <init>();
    <init>(java.lang.String);
    <init>(char[]);
    <init>(char[], int, int);
    <init>(int[], int, int);
    <init>(byte[], int, int, int);
    <init>(byte[], int);
    <init>(byte[], int, int, java.lang.String);
    <init>(byte[], int, int, java.nio.charset.Charset);
    <init>(byte[], java.lang.String);
    <init>(byte[], java.nio.charset.Charset);
    <init>(byte[], int, int);
    <init>(byte[]);
    <init>(java.lang.StringBuffer);
    <init>(java.lang.StringBuilder);

    public char charAt(int);
    public int codePointAt(int);
    public int codePointBefore(int);
    public int codePointCount(int, int);
    public int compareTo(java.lang.String);
    public int compareTo(java.lang.Object);
    public int compareToIgnoreCase(java.lang.String);
    public java.lang.String concat(java.lang.String);
    public boolean contains(java.lang.CharSequence);
    public boolean contentEquals(java.lang.StringBuffer);
    public boolean contentEquals(java.lang.CharSequence);
    public static java.lang.String copyValueOf(char[], int, int);
    public static java.lang.String copyValueOf(char[]);
    public boolean endsWith(java.lang.String);
    public boolean equals(java.lang.Object);
    public boolean equalsIgnoreCase(java.lang.String);
    public static java.lang.String format(java.lang.String, java.lang.Object[]);
    public static java.lang.String format(java.util.Locale, java.lang.String, java.lang.Object[]);
    public void getBytes(int, int, byte[], int);
    public byte[] getBytes(java.lang.String);
    public byte[] getBytes(java.nio.charset.Charset);
    public byte[] getBytes();
    public void getChars(int, int, char[], int);
    public int hashCode();
    public int indexOf(int);
    public int indexOf(int, int);
    public int indexOf(java.lang.String);
    public int indexOf(java.lang.String, int);
    public java.lang.String intern();
    public boolean isEmpty();
    public static java.lang.String join(java.lang.CharSequence, java.lang.CharSequence[]);
    public static java.lang.String join(java.lang.CharSequence, java.lang.Iterable);
    public int lastIndexOf(int);
    public int lastIndexOf(int, int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public boolean matches(java.lang.String);
    public int offsetByCodePoints(int, int);
    public boolean regionMatches(int, java.lang.String, int, int);
    public boolean regionMatches(boolean, int, java.lang.String, int, int);
    public java.lang.String replace(char, char);
    public java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence);
    public java.lang.String replaceAll(java.lang.String, java.lang.String);
    public java.lang.String replaceFirst(java.lang.String, java.lang.String);
    public java.lang.String[] split(java.lang.String, int);
    public java.lang.String[] split(java.lang.String);
    public boolean startsWith(java.lang.String, int);
    public boolean startsWith(java.lang.String);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String substring(int);
    public java.lang.String substring(int, int);
    public char[] toCharArray();
    public java.lang.String toLowerCase(java.util.Locale);
    public java.lang.String toLowerCase();
    public java.lang.String toString();
    public java.lang.String toUpperCase(java.util.Locale);
    public java.lang.String toUpperCase();
    public java.lang.String trim();
    public static java.lang.String valueOf(java.lang.Object);
    public static java.lang.String valueOf(char[]);
    public static java.lang.String valueOf(char[], int, int);
    public static java.lang.String valueOf(boolean);
    public static java.lang.String valueOf(char);
    public static java.lang.String valueOf(int);
    public static java.lang.String valueOf(long);
    public static java.lang.String valueOf(float);
    public static java.lang.String valueOf(double);


    public static java.util.Comparator CASE_INSENSITIVE_ORDER;
}

-keep class java.lang.StringBuffer {
    <init>();
    <init>(int);
    <init>(java.lang.String);
    <init>(java.lang.CharSequence);

    public synchronized java.lang.StringBuffer append(java.lang.Object);
    public synchronized java.lang.StringBuffer append(java.lang.String);
    public synchronized java.lang.StringBuffer append(java.lang.StringBuffer);
    public synchronized java.lang.StringBuffer append(java.lang.CharSequence);
    public synchronized java.lang.StringBuffer append(java.lang.CharSequence, int, int);
    public synchronized java.lang.StringBuffer append(char[]);
    public synchronized java.lang.StringBuffer append(char[], int, int);
    public synchronized java.lang.StringBuffer append(boolean);
    public synchronized java.lang.StringBuffer append(char);
    public synchronized java.lang.StringBuffer append(int);
    public synchronized java.lang.StringBuffer append(long);
    public synchronized java.lang.StringBuffer append(float);
    public synchronized java.lang.StringBuffer append(double);
    public java.lang.AbstractStringBuilder append(double);
    public java.lang.AbstractStringBuilder append(float);
    public java.lang.AbstractStringBuilder append(long);
    public java.lang.AbstractStringBuilder append(int);
    public java.lang.AbstractStringBuilder append(char);
    public java.lang.AbstractStringBuilder append(boolean);
    public java.lang.AbstractStringBuilder append(char[], int, int);
    public java.lang.AbstractStringBuilder append(char[]);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
    public java.lang.AbstractStringBuilder append(java.lang.String);
    public java.lang.AbstractStringBuilder append(java.lang.Object);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public synchronized java.lang.StringBuffer appendCodePoint(int);
    public java.lang.AbstractStringBuilder appendCodePoint(int);
    public synchronized int capacity();
    public synchronized char charAt(int);
    public synchronized int codePointAt(int);
    public synchronized int codePointBefore(int);
    public synchronized int codePointCount(int, int);
    public synchronized java.lang.StringBuffer delete(int, int);
    public java.lang.AbstractStringBuilder delete(int, int);
    public synchronized java.lang.StringBuffer deleteCharAt(int);
    public java.lang.AbstractStringBuilder deleteCharAt(int);
    public synchronized void ensureCapacity(int);
    public synchronized void getChars(int, int, char[], int);
    public int indexOf(java.lang.String);
    public synchronized int indexOf(java.lang.String, int);
    public synchronized java.lang.StringBuffer insert(int, char[], int, int);
    public synchronized java.lang.StringBuffer insert(int, java.lang.Object);
    public synchronized java.lang.StringBuffer insert(int, java.lang.String);
    public synchronized java.lang.StringBuffer insert(int, char[]);
    public java.lang.StringBuffer insert(int, java.lang.CharSequence);
    public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int);
    public java.lang.StringBuffer insert(int, boolean);
    public synchronized java.lang.StringBuffer insert(int, char);
    public java.lang.StringBuffer insert(int, int);
    public java.lang.StringBuffer insert(int, long);
    public java.lang.StringBuffer insert(int, float);
    public java.lang.StringBuffer insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, float);
    public java.lang.AbstractStringBuilder insert(int, long);
    public java.lang.AbstractStringBuilder insert(int, int);
    public java.lang.AbstractStringBuilder insert(int, char);
    public java.lang.AbstractStringBuilder insert(int, boolean);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
    public java.lang.AbstractStringBuilder insert(int, char[]);
    public java.lang.AbstractStringBuilder insert(int, java.lang.String);
    public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
    public java.lang.AbstractStringBuilder insert(int, char[], int, int);
    public int lastIndexOf(java.lang.String);
    public synchronized int lastIndexOf(java.lang.String, int);
    public synchronized int length();
    public synchronized int offsetByCodePoints(int, int);
    public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
    public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
    public synchronized java.lang.StringBuffer reverse();
    public java.lang.AbstractStringBuilder reverse();
    public synchronized void setCharAt(int, char);
    public synchronized void setLength(int);
    public synchronized java.lang.CharSequence subSequence(int, int);
    public synchronized java.lang.String substring(int);
    public synchronized java.lang.String substring(int, int);
    public synchronized java.lang.String toString();
    public synchronized void trimToSize();


}

-keep class java.lang.StringBuilder {
    <init>();
    <init>(int);
    <init>(java.lang.String);
    <init>(java.lang.CharSequence);

    public java.lang.StringBuilder append(java.lang.Object);
    public java.lang.StringBuilder append(java.lang.String);
    public java.lang.StringBuilder append(java.lang.StringBuffer);
    public java.lang.StringBuilder append(java.lang.CharSequence);
    public java.lang.StringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.StringBuilder append(char[]);
    public java.lang.StringBuilder append(char[], int, int);
    public java.lang.StringBuilder append(boolean);
    public java.lang.StringBuilder append(char);
    public java.lang.StringBuilder append(int);
    public java.lang.StringBuilder append(long);
    public java.lang.StringBuilder append(float);
    public java.lang.StringBuilder append(double);
    public java.lang.AbstractStringBuilder append(double);
    public java.lang.AbstractStringBuilder append(float);
    public java.lang.AbstractStringBuilder append(long);
    public java.lang.AbstractStringBuilder append(int);
    public java.lang.AbstractStringBuilder append(char);
    public java.lang.AbstractStringBuilder append(boolean);
    public java.lang.AbstractStringBuilder append(char[], int, int);
    public java.lang.AbstractStringBuilder append(char[]);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
    public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
    public java.lang.AbstractStringBuilder append(java.lang.String);
    public java.lang.AbstractStringBuilder append(java.lang.Object);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public java.lang.StringBuilder appendCodePoint(int);
    public java.lang.AbstractStringBuilder appendCodePoint(int);
    public int capacity();
    public char charAt(int);
    public int codePointAt(int);
    public int codePointBefore(int);
    public int codePointCount(int, int);
    public java.lang.StringBuilder delete(int, int);
    public java.lang.AbstractStringBuilder delete(int, int);
    public java.lang.StringBuilder deleteCharAt(int);
    public java.lang.AbstractStringBuilder deleteCharAt(int);
    public void ensureCapacity(int);
    public void getChars(int, int, char[], int);
    public int indexOf(java.lang.String);
    public int indexOf(java.lang.String, int);
    public java.lang.StringBuilder insert(int, char[], int, int);
    public java.lang.StringBuilder insert(int, java.lang.Object);
    public java.lang.StringBuilder insert(int, java.lang.String);
    public java.lang.StringBuilder insert(int, char[]);
    public java.lang.StringBuilder insert(int, java.lang.CharSequence);
    public java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.StringBuilder insert(int, boolean);
    public java.lang.StringBuilder insert(int, char);
    public java.lang.StringBuilder insert(int, int);
    public java.lang.StringBuilder insert(int, long);
    public java.lang.StringBuilder insert(int, float);
    public java.lang.StringBuilder insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, double);
    public java.lang.AbstractStringBuilder insert(int, float);
    public java.lang.AbstractStringBuilder insert(int, long);
    public java.lang.AbstractStringBuilder insert(int, int);
    public java.lang.AbstractStringBuilder insert(int, char);
    public java.lang.AbstractStringBuilder insert(int, boolean);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
    public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
    public java.lang.AbstractStringBuilder insert(int, char[]);
    public java.lang.AbstractStringBuilder insert(int, java.lang.String);
    public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
    public java.lang.AbstractStringBuilder insert(int, char[], int, int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String, int);
    public int length();
    public int offsetByCodePoints(int, int);
    public java.lang.StringBuilder replace(int, int, java.lang.String);
    public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
    public java.lang.StringBuilder reverse();
    public java.lang.AbstractStringBuilder reverse();
    public void setCharAt(int, char);
    public void setLength(int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String substring(int, int);
    public java.lang.String substring(int);
    public java.lang.String toString();
    public void trimToSize();


}

-keep class java.lang.Thread {
    <init>();
    <init>(java.lang.Runnable);
    <init>(java.lang.ThreadGroup, java.lang.Runnable);
    <init>(java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.String);
    <init>(java.lang.Runnable, java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long);

    public static int activeCount();
    public void blockedOn(sun.nio.ch.Interruptible);
    public void checkAccess();
    protected java.lang.Object clone();
    public int countStackFrames();
    public static java.lang.Thread currentThread();
    public void destroy();
    public void dispatchUncaughtException(java.lang.Throwable);
    public static void dumpStack();
    public static int enumerate(java.lang.Thread[]);
    public static java.util.Map getAllStackTraces();
    public java.lang.ClassLoader getContextClassLoader();
    public static java.lang.Thread$UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
    public long getId();
    public java.lang.String getName();
    public int getPriority();
    public java.lang.StackTraceElement[] getStackTrace();
    public java.lang.Thread$State getState();
    public java.lang.ThreadGroup getThreadGroup();
    public java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionHandler();
    public static java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionPreHandler();
    public static boolean holdsLock(java.lang.Object);
    public void interrupt();
    public static boolean interrupted();
    public boolean isAlive();
    public boolean isDaemon();
    public boolean isInterrupted();
    public void join(long);
    public void join(long, int);
    public void join();
    public void parkFor$(long);
    public void parkUntil$(long);
    public void resume();
    public void run();
    public void setContextClassLoader(java.lang.ClassLoader);
    public void setDaemon(boolean);
    public static void setDefaultUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
    public void setName(java.lang.String);
    public void setPriority(int);
    public void setUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
    public static void setUncaughtExceptionPreHandler(java.lang.Thread$UncaughtExceptionHandler);
    public static void sleep(long);
    public static void sleep(long, int);
    public synchronized void start();
    public void stop();
    public void stop(java.lang.Throwable);
    public void suspend();
    public java.lang.String toString();
    public void unpark$();
    public static void yield();


    public static int MAX_PRIORITY;
    public static int MIN_PRIORITY;
    public static int NORM_PRIORITY;
}

-keep class java.lang.Thread$State {

    public static java.lang.Thread$State valueOf(java.lang.String);
    public static java.lang.Thread$State[] values();

    public static java.lang.Thread$State BLOCKED;
    public static java.lang.Thread$State NEW;
    public static java.lang.Thread$State RUNNABLE;
    public static java.lang.Thread$State TERMINATED;
    public static java.lang.Thread$State TIMED_WAITING;
    public static java.lang.Thread$State WAITING;

}

-keep class java.lang.Thread$UncaughtExceptionHandler {

    public abstract void uncaughtException(java.lang.Thread, java.lang.Throwable);


}

-keep class java.lang.ThreadGroup {
    <init>(java.lang.String);
    <init>(java.lang.ThreadGroup, java.lang.String);

    public int activeCount();
    public int activeGroupCount();
    public boolean allowThreadSuspension(boolean);
    public void checkAccess();
    public void destroy();
    public int enumerate(java.lang.Thread[]);
    public int enumerate(java.lang.Thread[], boolean);
    public int enumerate(java.lang.ThreadGroup[]);
    public int enumerate(java.lang.ThreadGroup[], boolean);
    public int getMaxPriority();
    public java.lang.String getName();
    public java.lang.ThreadGroup getParent();
    public void interrupt();
    public boolean isDaemon();
    public synchronized boolean isDestroyed();
    public void list();
    public boolean parentOf(java.lang.ThreadGroup);
    public void resume();
    public void setDaemon(boolean);
    public void setMaxPriority(int);
    public void stop();
    public void suspend();
    public java.lang.String toString();
    public void uncaughtException(java.lang.Thread, java.lang.Throwable);


}

-keep class java.lang.ThreadLocal {
    <init>();

    public java.lang.Object get();
    protected java.lang.Object initialValue();
    public void remove();
    public void set(java.lang.Object);
    public static java.lang.ThreadLocal withInitial(java.util.function.Supplier);


}

-keep class java.lang.Throwable {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable, boolean, boolean);

    public synchronized void addSuppressed(java.lang.Throwable);
    public synchronized java.lang.Throwable fillInStackTrace();
    public synchronized java.lang.Throwable getCause();
    public java.lang.String getLocalizedMessage();
    public java.lang.String getMessage();
    public java.lang.StackTraceElement[] getStackTrace();
    public synchronized java.lang.Throwable[] getSuppressed();
    public synchronized java.lang.Throwable initCause(java.lang.Throwable);
    public void printStackTrace();
    public void printStackTrace(java.io.PrintStream);
    public void printStackTrace(java.io.PrintWriter);
    public void setStackTrace(java.lang.StackTraceElement[]);
    public java.lang.String toString();


}

-keep class java.lang.annotation.Annotation {

    public abstract java.lang.Class annotationType();
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public abstract java.lang.String toString();


}

-keep class java.lang.reflect.AccessibleObject {
    <init>();

    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
    public boolean isAccessible();
    public boolean isAnnotationPresent(java.lang.Class);
    public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean);
    public void setAccessible(boolean);


}

-keep class java.lang.reflect.Constructor {

    public boolean equals(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class getDeclaringClass();
    public java.lang.Class[] getExceptionTypes();
    public java.lang.reflect.Type[] getGenericExceptionTypes();
    public java.lang.reflect.Type[] getGenericParameterTypes();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.annotation.Annotation[][] getParameterAnnotations();
    public int getParameterCount();
    public java.lang.Class[] getParameterTypes();
    public java.lang.reflect.TypeVariable[] getTypeParameters();
    public int hashCode();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.Object newInstance(java.lang.Object[]);
    public java.lang.reflect.Constructor serializationCopy(java.lang.Class, java.lang.Class);
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.reflect.Executable {

    public int getAccessFlags();
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public long getArtMethod();
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public abstract java.lang.Class getDeclaringClass();
    public abstract java.lang.Class[] getExceptionTypes();
    public java.lang.reflect.Type[] getGenericExceptionTypes();
    public java.lang.reflect.Type[] getGenericParameterTypes();
    public abstract int getModifiers();
    public abstract java.lang.String getName();
    public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
    public int getParameterCount();
    public abstract java.lang.Class[] getParameterTypes();
    public java.lang.reflect.Parameter[] getParameters();
    public abstract java.lang.reflect.TypeVariable[] getTypeParameters();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isSynthetic();
    public boolean isVarArgs();
    public abstract java.lang.String toGenericString();


}

-keep class java.lang.reflect.Field {

    public boolean equals(java.lang.Object);
    public java.lang.Object get(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public long getArtField();
    public boolean getBoolean(java.lang.Object);
    public byte getByte(java.lang.Object);
    public char getChar(java.lang.Object);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class getDeclaringClass();
    public int getDexFieldIndex();
    public double getDouble(java.lang.Object);
    public float getFloat(java.lang.Object);
    public java.lang.reflect.Type getGenericType();
    public int getInt(java.lang.Object);
    public long getLong(java.lang.Object);
    public int getModifiers();
    public java.lang.String getName();
    public int getOffset();
    public short getShort(java.lang.Object);
    public java.lang.Class getType();
    public int hashCode();
    public boolean isAnnotationPresent(java.lang.Class);
    public boolean isEnumConstant();
    public boolean isSynthetic();
    public void set(java.lang.Object, java.lang.Object);
    public void setBoolean(java.lang.Object, boolean);
    public void setByte(java.lang.Object, byte);
    public void setChar(java.lang.Object, char);
    public void setDouble(java.lang.Object, double);
    public void setFloat(java.lang.Object, float);
    public void setInt(java.lang.Object, int);
    public void setLong(java.lang.Object, long);
    public void setShort(java.lang.Object, short);
    public java.lang.String toGenericString();
    public java.lang.String toString();


}

-keep class java.lang.reflect.GenericDeclaration {

    public abstract java.lang.reflect.TypeVariable[] getTypeParameters();


}

-keep class java.lang.reflect.InvocationTargetException {
    <init>();
    <init>(java.lang.Throwable);
    <init>(java.lang.Throwable, java.lang.String);

    public java.lang.Throwable getCause();
    public java.lang.Throwable getTargetException();


}

-keep class java.lang.reflect.Method {

    public boolean equals(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.Class getDeclaringClass();
    public java.lang.Object getDefaultValue();
    public java.lang.Class[] getExceptionTypes();
    public java.lang.reflect.Type[] getGenericExceptionTypes();
    public java.lang.reflect.Type[] getGenericParameterTypes();
    public java.lang.reflect.Type getGenericReturnType();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.annotation.Annotation[][] getParameterAnnotations();
    public int getParameterCount();
    public java.lang.Class[] getParameterTypes();
    public java.lang.Class getReturnType();
    public java.lang.reflect.TypeVariable[] getTypeParameters();
    public int hashCode();
    public java.lang.Object invoke(java.lang.Object, java.lang.Object[]);
    public boolean isBridge();
    public boolean isDefault();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.String toGenericString();
    public java.lang.String toString();


    public static java.util.Comparator ORDER_BY_SIGNATURE;
}

-keep class java.lang.reflect.Parameter {

    public boolean equals(java.lang.Object);
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getAnnotations();
    public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
    public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
    public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
    public java.lang.reflect.Executable getDeclaringExecutable();
    public int getModifiers();
    public java.lang.String getName();
    public java.lang.reflect.Type getParameterizedType();
    public java.lang.Class getType();
    public int hashCode();
    public boolean isImplicit();
    public boolean isNamePresent();
    public boolean isSynthetic();
    public boolean isVarArgs();
    public java.lang.String toString();


}

-keep class java.lang.reflect.Type {

    public java.lang.String getTypeName();


}

-keep class java.lang.reflect.TypeVariable {

    public abstract java.lang.reflect.Type[] getBounds();
    public abstract java.lang.reflect.GenericDeclaration getGenericDeclaration();
    public abstract java.lang.String getName();


}

-keep class java.net.ContentHandler {
    <init>();

    public abstract java.lang.Object getContent(java.net.URLConnection);
    public java.lang.Object getContent(java.net.URLConnection, java.lang.Class[]);


}

-keep class java.net.ContentHandlerFactory {

    public abstract java.net.ContentHandler createContentHandler(java.lang.String);


}

-keep class java.net.DatagramPacket {
    <init>(byte[], int, int);
    <init>(byte[], int);
    <init>(byte[], int, int, java.net.InetAddress, int);
    <init>(byte[], int, int, java.net.SocketAddress);
    <init>(byte[], int, java.net.InetAddress, int);
    <init>(byte[], int, java.net.SocketAddress);

    public synchronized java.net.InetAddress getAddress();
    public synchronized byte[] getData();
    public synchronized int getLength();
    public synchronized int getOffset();
    public synchronized int getPort();
    public synchronized java.net.SocketAddress getSocketAddress();
    public synchronized void setAddress(java.net.InetAddress);
    public synchronized void setData(byte[], int, int);
    public synchronized void setData(byte[]);
    public synchronized void setLength(int);
    public synchronized void setPort(int);
    public void setReceivedLength(int);
    public synchronized void setSocketAddress(java.net.SocketAddress);


}

-keep class java.net.DatagramSocket {
    <init>();
    <init>(java.net.DatagramSocketImpl);
    <init>(java.net.SocketAddress);
    <init>(int);
    <init>(int, java.net.InetAddress);

    public synchronized void bind(java.net.SocketAddress);
    public void close();
    public void connect(java.net.InetAddress, int);
    public void connect(java.net.SocketAddress);
    public void disconnect();
    public synchronized boolean getBroadcast();
    public java.nio.channels.DatagramChannel getChannel();
    public java.io.FileDescriptor getFileDescriptor$();
    public java.net.InetAddress getInetAddress();
    public java.net.InetAddress getLocalAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public int getPort();
    public synchronized int getReceiveBufferSize();
    public java.net.SocketAddress getRemoteSocketAddress();
    public synchronized boolean getReuseAddress();
    public synchronized int getSendBufferSize();
    public synchronized int getSoTimeout();
    public synchronized int getTrafficClass();
    public boolean isBound();
    public boolean isClosed();
    public boolean isConnected();
    public synchronized void receive(java.net.DatagramPacket);
    public void send(java.net.DatagramPacket);
    public synchronized void setBroadcast(boolean);
    public static synchronized void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory);
    public synchronized void setReceiveBufferSize(int);
    public synchronized void setReuseAddress(boolean);
    public synchronized void setSendBufferSize(int);
    public synchronized void setSoTimeout(int);
    public synchronized void setTrafficClass(int);


}

-keep class java.net.DatagramSocketImpl {
    <init>();

    protected abstract void bind(int, java.net.InetAddress);
    protected abstract void close();
    protected void connect(java.net.InetAddress, int);
    protected abstract void create();
    protected void disconnect();
    protected java.io.FileDescriptor getFileDescriptor();
    protected int getLocalPort();
    protected abstract byte getTTL();
    protected abstract int getTimeToLive();
    protected abstract void join(java.net.InetAddress);
    protected abstract void joinGroup(java.net.SocketAddress, java.net.NetworkInterface);
    protected abstract void leave(java.net.InetAddress);
    protected abstract void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface);
    protected abstract int peek(java.net.InetAddress);
    protected abstract int peekData(java.net.DatagramPacket);
    protected abstract void receive(java.net.DatagramPacket);
    protected abstract void send(java.net.DatagramPacket);
    protected abstract void setTTL(byte);
    protected abstract void setTimeToLive(int);


    protected java.io.FileDescriptor fd;
    protected int localPort;
}

-keep class java.net.DatagramSocketImplFactory {

    public abstract java.net.DatagramSocketImpl createDatagramSocketImpl();


}

-keep class java.net.FileNameMap {

    public abstract java.lang.String getContentTypeFor(java.lang.String);


}

-keep class java.net.InetAddress {

    public static void clearDnsCache();
    public boolean equals(java.lang.Object);
    public byte[] getAddress();
    public static java.net.InetAddress[] getAllByName(java.lang.String);
    public static java.net.InetAddress[] getAllByNameOnNet(java.lang.String, int);
    public static java.net.InetAddress getByAddress(java.lang.String, byte[]);
    public static java.net.InetAddress getByAddress(byte[]);
    public static java.net.InetAddress getByName(java.lang.String);
    public static java.net.InetAddress getByNameOnNet(java.lang.String, int);
    public java.lang.String getCanonicalHostName();
    public java.lang.String getHostAddress();
    public java.lang.String getHostName();
    public static java.net.InetAddress getLocalHost();
    public static java.net.InetAddress getLoopbackAddress();
    public int hashCode();
    public boolean isAnyLocalAddress();
    public boolean isLinkLocalAddress();
    public boolean isLoopbackAddress();
    public boolean isMCGlobal();
    public boolean isMCLinkLocal();
    public boolean isMCNodeLocal();
    public boolean isMCOrgLocal();
    public boolean isMCSiteLocal();
    public boolean isMulticastAddress();
    public static boolean isNumeric(java.lang.String);
    public boolean isReachable(int);
    public boolean isReachable(java.net.NetworkInterface, int, int);
    public boolean isReachableByICMP(int);
    public boolean isSiteLocalAddress();
    public static java.net.InetAddress parseNumericAddress(java.lang.String);
    public java.lang.String toString();


}

-keep class java.net.InterfaceAddress {

    public boolean equals(java.lang.Object);
    public java.net.InetAddress getAddress();
    public java.net.InetAddress getBroadcast();
    public short getNetworkPrefixLength();
    public int hashCode();
    public java.lang.String toString();


}

-keep class java.net.MalformedURLException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.net.NetworkInterface {

    public boolean equals(java.lang.Object);
    public static java.net.NetworkInterface getByIndex(int);
    public static java.net.NetworkInterface getByInetAddress(java.net.InetAddress);
    public static java.net.NetworkInterface getByName(java.lang.String);
    public java.lang.String getDisplayName();
    public byte[] getHardwareAddress();
    public int getIndex();
    public java.util.Enumeration getInetAddresses();
    public java.util.List getInterfaceAddresses();
    public int getMTU();
    public java.lang.String getName();
    public static java.util.Enumeration getNetworkInterfaces();
    public java.net.NetworkInterface getParent();
    public java.util.Enumeration getSubInterfaces();
    public int hashCode();
    public boolean isLoopback();
    public boolean isPointToPoint();
    public boolean isUp();
    public boolean isVirtual();
    public boolean supportsMulticast();
    public java.lang.String toString();


}

-keep class java.net.ProtocolFamily {

    public abstract java.lang.String name();


}

-keep class java.net.Proxy {
    <init>(java.net.Proxy$Type, java.net.SocketAddress);

    public java.net.SocketAddress address();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
    public java.net.Proxy$Type type();


    public static java.net.Proxy NO_PROXY;
}

-keep class java.net.Proxy$Type {

    public static java.net.Proxy$Type valueOf(java.lang.String);
    public static java.net.Proxy$Type[] values();

    public static java.net.Proxy$Type DIRECT;
    public static java.net.Proxy$Type HTTP;
    public static java.net.Proxy$Type SOCKS;

}

-keep class java.net.ServerSocket {
    <init>();
    <init>(int);
    <init>(int, int);
    <init>(int, int, java.net.InetAddress);

    public java.net.Socket accept();
    public void bind(java.net.SocketAddress);
    public void bind(java.net.SocketAddress, int);
    public void close();
    public java.nio.channels.ServerSocketChannel getChannel();
    public java.io.FileDescriptor getFileDescriptor$();
    public java.net.SocketImpl getImpl();
    public java.net.InetAddress getInetAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public synchronized int getReceiveBufferSize();
    public boolean getReuseAddress();
    public synchronized int getSoTimeout();
    protected void implAccept(java.net.Socket);
    public boolean isBound();
    public boolean isClosed();
    public void setPerformancePreferences(int, int, int);
    public synchronized void setReceiveBufferSize(int);
    public void setReuseAddress(boolean);
    public synchronized void setSoTimeout(int);
    public static synchronized void setSocketFactory(java.net.SocketImplFactory);
    public java.lang.String toString();


}

-keep class java.net.Socket {
    <init>();
    <init>(java.net.Proxy);
    <init>(java.net.SocketImpl);
    <init>(java.lang.String, int);
    <init>(java.net.InetAddress, int);
    <init>(java.lang.String, int, java.net.InetAddress, int);
    <init>(java.net.InetAddress, int, java.net.InetAddress, int);
    <init>(java.lang.String, int, boolean);
    <init>(java.net.InetAddress, int, boolean);

    public void bind(java.net.SocketAddress);
    public synchronized void close();
    public void connect(java.net.SocketAddress);
    public void connect(java.net.SocketAddress, int);
    public java.nio.channels.SocketChannel getChannel();
    public java.io.FileDescriptor getFileDescriptor$();
    public java.net.InetAddress getInetAddress();
    public java.io.InputStream getInputStream();
    public boolean getKeepAlive();
    public java.net.InetAddress getLocalAddress();
    public int getLocalPort();
    public java.net.SocketAddress getLocalSocketAddress();
    public boolean getOOBInline();
    public java.io.OutputStream getOutputStream();
    public int getPort();
    public synchronized int getReceiveBufferSize();
    public java.net.SocketAddress getRemoteSocketAddress();
    public boolean getReuseAddress();
    public synchronized int getSendBufferSize();
    public int getSoLinger();
    public synchronized int getSoTimeout();
    public boolean getTcpNoDelay();
    public int getTrafficClass();
    public boolean isBound();
    public boolean isClosed();
    public boolean isConnected();
    public boolean isInputShutdown();
    public boolean isOutputShutdown();
    public void sendUrgentData(int);
    public void setKeepAlive(boolean);
    public void setOOBInline(boolean);
    public void setPerformancePreferences(int, int, int);
    public synchronized void setReceiveBufferSize(int);
    public void setReuseAddress(boolean);
    public synchronized void setSendBufferSize(int);
    public void setSoLinger(boolean, int);
    public synchronized void setSoTimeout(int);
    public static synchronized void setSocketImplFactory(java.net.SocketImplFactory);
    public void setTcpNoDelay(boolean);
    public void setTrafficClass(int);
    public void shutdownInput();
    public void shutdownOutput();
    public java.lang.String toString();


}

-keep class java.net.SocketAddress {
    <init>();



}

-keep class java.net.SocketException {
    <init>(java.lang.String);
    <init>();
    <init>(java.lang.Throwable);
    <init>(java.lang.String, java.lang.Throwable);



}

-keep class java.net.SocketImpl {
    <init>();

    protected abstract void accept(java.net.SocketImpl);
    protected abstract int available();
    protected abstract void bind(java.net.InetAddress, int);
    protected abstract void close();
    protected abstract void connect(java.lang.String, int);
    protected abstract void connect(java.net.InetAddress, int);
    protected abstract void connect(java.net.SocketAddress, int);
    protected abstract void create(boolean);
    public java.io.FileDescriptor getFD$();
    protected java.io.FileDescriptor getFileDescriptor();
    protected java.net.InetAddress getInetAddress();
    protected abstract java.io.InputStream getInputStream();
    protected int getLocalPort();
    protected abstract java.io.OutputStream getOutputStream();
    protected int getPort();
    protected abstract void listen(int);
    protected abstract void sendUrgentData(int);
    protected void setPerformancePreferences(int, int, int);
    protected void shutdownInput();
    protected void shutdownOutput();
    protected boolean supportsUrgentData();
    public java.lang.String toString();


    protected java.net.InetAddress address;
    protected java.io.FileDescriptor fd;
    protected int localport;
    protected int port;
}

-keep class java.net.SocketImplFactory {

    public abstract java.net.SocketImpl createSocketImpl();


}

-keep class java.net.SocketOption {

    public abstract java.lang.String name();
    public abstract java.lang.Class type();


}

-keep class java.net.URI {
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);

    public int compareTo(java.net.URI);
    public int compareTo(java.lang.Object);
    public static java.net.URI create(java.lang.String);
    public boolean equals(java.lang.Object);
    public java.lang.String getAuthority();
    public java.lang.String getFragment();
    public java.lang.String getHost();
    public java.lang.String getPath();
    public int getPort();
    public java.lang.String getQuery();
    public java.lang.String getRawAuthority();
    public java.lang.String getRawFragment();
    public java.lang.String getRawPath();
    public java.lang.String getRawQuery();
    public java.lang.String getRawSchemeSpecificPart();
    public java.lang.String getRawUserInfo();
    public java.lang.String getScheme();
    public java.lang.String getSchemeSpecificPart();
    public java.lang.String getUserInfo();
    public int hashCode();
    public boolean isAbsolute();
    public boolean isOpaque();
    public java.net.URI normalize();
    public java.net.URI parseServerAuthority();
    public java.net.URI relativize(java.net.URI);
    public java.net.URI resolve(java.net.URI);
    public java.net.URI resolve(java.lang.String);
    public java.lang.String toASCIIString();
    public java.lang.String toString();
    public java.net.URL toURL();


}

-keep class java.net.URISyntaxException {
    <init>(java.lang.String, java.lang.String, int);
    <init>(java.lang.String, java.lang.String);

    public int getIndex();
    public java.lang.String getInput();
    public java.lang.String getMessage();
    public java.lang.String getReason();


}

-keep class java.net.URL {
    <init>(java.lang.String, java.lang.String, int, java.lang.String);
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler);
    <init>(java.lang.String);
    <init>(java.net.URL, java.lang.String);
    <init>(java.net.URL, java.lang.String, java.net.URLStreamHandler);

    public boolean equals(java.lang.Object);
    public java.lang.String getAuthority();
    public java.lang.Object getContent();
    public java.lang.Object getContent(java.lang.Class[]);
    public int getDefaultPort();
    public java.lang.String getFile();
    public java.lang.String getHost();
    public java.lang.String getPath();
    public int getPort();
    public java.lang.String getProtocol();
    public java.lang.String getQuery();
    public java.lang.String getRef();
    public java.lang.String getUserInfo();
    public synchronized int hashCode();
    public java.net.URLConnection openConnection();
    public java.net.URLConnection openConnection(java.net.Proxy);
    public java.io.InputStream openStream();
    public boolean sameFile(java.net.URL);
    public static void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
    public java.lang.String toExternalForm();
    public java.lang.String toString();
    public java.net.URI toURI();


}

-keep class java.net.URLConnection {
    <init>(java.net.URL);

    public void addRequestProperty(java.lang.String, java.lang.String);
    public abstract void connect();
    public boolean getAllowUserInteraction();
    public int getConnectTimeout();
    public java.lang.Object getContent();
    public java.lang.Object getContent(java.lang.Class[]);
    public java.lang.String getContentEncoding();
    public int getContentLength();
    public long getContentLengthLong();
    public java.lang.String getContentType();
    public long getDate();
    public static boolean getDefaultAllowUserInteraction();
    public static java.lang.String getDefaultRequestProperty(java.lang.String);
    public boolean getDefaultUseCaches();
    public boolean getDoInput();
    public boolean getDoOutput();
    public long getExpiration();
    public static synchronized java.net.FileNameMap getFileNameMap();
    public java.lang.String getHeaderField(java.lang.String);
    public java.lang.String getHeaderField(int);
    public long getHeaderFieldDate(java.lang.String, long);
    public int getHeaderFieldInt(java.lang.String, int);
    public java.lang.String getHeaderFieldKey(int);
    public long getHeaderFieldLong(java.lang.String, long);
    public java.util.Map getHeaderFields();
    public long getIfModifiedSince();
    public java.io.InputStream getInputStream();
    public long getLastModified();
    public java.io.OutputStream getOutputStream();
    public java.security.Permission getPermission();
    public int getReadTimeout();
    public java.util.Map getRequestProperties();
    public java.lang.String getRequestProperty(java.lang.String);
    public java.net.URL getURL();
    public boolean getUseCaches();
    public static java.lang.String guessContentTypeFromName(java.lang.String);
    public static java.lang.String guessContentTypeFromStream(java.io.InputStream);
    public void setAllowUserInteraction(boolean);
    public void setConnectTimeout(int);
    public static synchronized void setContentHandlerFactory(java.net.ContentHandlerFactory);
    public static void setDefaultAllowUserInteraction(boolean);
    public static void setDefaultRequestProperty(java.lang.String, java.lang.String);
    public void setDefaultUseCaches(boolean);
    public void setDoInput(boolean);
    public void setDoOutput(boolean);
    public static void setFileNameMap(java.net.FileNameMap);
    public void setIfModifiedSince(long);
    public void setReadTimeout(int);
    public void setRequestProperty(java.lang.String, java.lang.String);
    public void setUseCaches(boolean);
    public java.lang.String toString();


    protected boolean allowUserInteraction;
    protected boolean connected;
    protected boolean doInput;
    protected boolean doOutput;
    protected long ifModifiedSince;
    protected java.net.URL url;
    protected boolean useCaches;
}

-keep class java.net.URLStreamHandler {
    <init>();

    protected boolean equals(java.net.URL, java.net.URL);
    protected int getDefaultPort();
    protected synchronized java.net.InetAddress getHostAddress(java.net.URL);
    protected int hashCode(java.net.URL);
    protected boolean hostsEqual(java.net.URL, java.net.URL);
    protected abstract java.net.URLConnection openConnection(java.net.URL);
    protected java.net.URLConnection openConnection(java.net.URL, java.net.Proxy);
    protected void parseURL(java.net.URL, java.lang.String, int, int);
    protected boolean sameFile(java.net.URL, java.net.URL);
    protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
    protected java.lang.String toExternalForm(java.net.URL);


}

-keep class java.net.URLStreamHandlerFactory {

    public abstract java.net.URLStreamHandler createURLStreamHandler(java.lang.String);


}

-keep class java.net.UnknownHostException {
    <init>(java.lang.String);
    <init>();



}

-keep class java.nio.Buffer {

    public abstract java.lang.Object array();
    public abstract int arrayOffset();
    public int capacity();
    public java.nio.Buffer clear();
    public java.nio.Buffer flip();
    public int getElementSizeShift();
    public abstract boolean hasArray();
    public boolean hasRemaining();
    public abstract boolean isDirect();
    public abstract boolean isReadOnly();
    public int limit();
    public java.nio.Buffer limit(int);
    public java.nio.Buffer mark();
    public int position();
    public java.nio.Buffer position(int);
    public int remaining();
    public java.nio.Buffer reset();
    public java.nio.Buffer rewind();


}

-keep class java.nio.ByteBuffer {

    public static java.nio.ByteBuffer allocate(int);
    public static java.nio.ByteBuffer allocateDirect(int);
    public byte[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.CharBuffer asCharBuffer();
    public abstract java.nio.DoubleBuffer asDoubleBuffer();
    public abstract java.nio.FloatBuffer asFloatBuffer();
    public abstract java.nio.IntBuffer asIntBuffer();
    public abstract java.nio.LongBuffer asLongBuffer();
    public abstract java.nio.ByteBuffer asReadOnlyBuffer();
    public abstract java.nio.ShortBuffer asShortBuffer();
    public abstract java.nio.ByteBuffer compact();
    public int compareTo(java.nio.ByteBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.ByteBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract byte get();
    public abstract byte get(int);
    public java.nio.ByteBuffer get(byte[], int, int);
    public java.nio.ByteBuffer get(byte[]);
    public abstract char getChar();
    public abstract char getChar(int);
    public abstract double getDouble();
    public abstract double getDouble(int);
    public abstract float getFloat();
    public abstract float getFloat(int);
    public abstract int getInt();
    public abstract int getInt(int);
    public abstract long getLong();
    public abstract long getLong(int);
    public abstract short getShort();
    public abstract short getShort(int);
    public boolean hasArray();
    public int hashCode();
    public boolean isAccessible();
    public abstract boolean isDirect();
    public java.nio.ByteOrder order();
    public java.nio.ByteBuffer order(java.nio.ByteOrder);
    public abstract java.nio.ByteBuffer put(byte);
    public abstract java.nio.ByteBuffer put(int, byte);
    public java.nio.ByteBuffer put(java.nio.ByteBuffer);
    public java.nio.ByteBuffer put(byte[], int, int);
    public java.nio.ByteBuffer put(byte[]);
    public abstract java.nio.ByteBuffer putChar(char);
    public abstract java.nio.ByteBuffer putChar(int, char);
    public abstract java.nio.ByteBuffer putDouble(double);
    public abstract java.nio.ByteBuffer putDouble(int, double);
    public abstract java.nio.ByteBuffer putFloat(float);
    public abstract java.nio.ByteBuffer putFloat(int, float);
    public abstract java.nio.ByteBuffer putInt(int);
    public abstract java.nio.ByteBuffer putInt(int, int);
    public abstract java.nio.ByteBuffer putLong(long);
    public abstract java.nio.ByteBuffer putLong(int, long);
    public abstract java.nio.ByteBuffer putShort(short);
    public abstract java.nio.ByteBuffer putShort(int, short);
    public void setAccessible(boolean);
    public abstract java.nio.ByteBuffer slice();
    public java.lang.String toString();
    public static java.nio.ByteBuffer wrap(byte[], int, int);
    public static java.nio.ByteBuffer wrap(byte[]);


}

-keep class java.nio.ByteOrder {

    public static java.nio.ByteOrder nativeOrder();
    public java.lang.String toString();


    public static java.nio.ByteOrder BIG_ENDIAN;
    public static java.nio.ByteOrder LITTLE_ENDIAN;
}

-keep class java.nio.CharBuffer {

    public static java.nio.CharBuffer allocate(int);
    public java.nio.CharBuffer append(java.lang.CharSequence);
    public java.nio.CharBuffer append(java.lang.CharSequence, int, int);
    public java.nio.CharBuffer append(char);
    public java.lang.Appendable append(char);
    public java.lang.Appendable append(java.lang.CharSequence, int, int);
    public java.lang.Appendable append(java.lang.CharSequence);
    public char[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.CharBuffer asReadOnlyBuffer();
    public char charAt(int);
    public java.util.stream.IntStream chars();
    public abstract java.nio.CharBuffer compact();
    public int compareTo(java.nio.CharBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.CharBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract char get();
    public abstract char get(int);
    public java.nio.CharBuffer get(char[], int, int);
    public java.nio.CharBuffer get(char[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public int length();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.CharBuffer put(char);
    public abstract java.nio.CharBuffer put(int, char);
    public java.nio.CharBuffer put(java.nio.CharBuffer);
    public java.nio.CharBuffer put(char[], int, int);
    public java.nio.CharBuffer put(char[]);
    public java.nio.CharBuffer put(java.lang.String, int, int);
    public java.nio.CharBuffer put(java.lang.String);
    public int read(java.nio.CharBuffer);
    public abstract java.nio.CharBuffer slice();
    public abstract java.nio.CharBuffer subSequence(int, int);
    public java.lang.CharSequence subSequence(int, int);
    public java.lang.String toString();
    public static java.nio.CharBuffer wrap(char[], int, int);
    public static java.nio.CharBuffer wrap(char[]);
    public static java.nio.CharBuffer wrap(java.lang.CharSequence, int, int);
    public static java.nio.CharBuffer wrap(java.lang.CharSequence);


}

-keep class java.nio.DoubleBuffer {

    public static java.nio.DoubleBuffer allocate(int);
    public double[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.DoubleBuffer asReadOnlyBuffer();
    public abstract java.nio.DoubleBuffer compact();
    public int compareTo(java.nio.DoubleBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.DoubleBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract double get();
    public abstract double get(int);
    public java.nio.DoubleBuffer get(double[], int, int);
    public java.nio.DoubleBuffer get(double[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.DoubleBuffer put(double);
    public abstract java.nio.DoubleBuffer put(int, double);
    public java.nio.DoubleBuffer put(java.nio.DoubleBuffer);
    public java.nio.DoubleBuffer put(double[], int, int);
    public java.nio.DoubleBuffer put(double[]);
    public abstract java.nio.DoubleBuffer slice();
    public java.lang.String toString();
    public static java.nio.DoubleBuffer wrap(double[], int, int);
    public static java.nio.DoubleBuffer wrap(double[]);


}

-keep class java.nio.FloatBuffer {

    public static java.nio.FloatBuffer allocate(int);
    public float[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.FloatBuffer asReadOnlyBuffer();
    public abstract java.nio.FloatBuffer compact();
    public int compareTo(java.nio.FloatBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.FloatBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract float get();
    public abstract float get(int);
    public java.nio.FloatBuffer get(float[], int, int);
    public java.nio.FloatBuffer get(float[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.FloatBuffer put(float);
    public abstract java.nio.FloatBuffer put(int, float);
    public java.nio.FloatBuffer put(java.nio.FloatBuffer);
    public java.nio.FloatBuffer put(float[], int, int);
    public java.nio.FloatBuffer put(float[]);
    public abstract java.nio.FloatBuffer slice();
    public java.lang.String toString();
    public static java.nio.FloatBuffer wrap(float[], int, int);
    public static java.nio.FloatBuffer wrap(float[]);


}

-keep class java.nio.IntBuffer {

    public static java.nio.IntBuffer allocate(int);
    public int[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.IntBuffer asReadOnlyBuffer();
    public abstract java.nio.IntBuffer compact();
    public int compareTo(java.nio.IntBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.IntBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract int get();
    public abstract int get(int);
    public java.nio.IntBuffer get(int[], int, int);
    public java.nio.IntBuffer get(int[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.IntBuffer put(int);
    public abstract java.nio.IntBuffer put(int, int);
    public java.nio.IntBuffer put(java.nio.IntBuffer);
    public java.nio.IntBuffer put(int[], int, int);
    public java.nio.IntBuffer put(int[]);
    public abstract java.nio.IntBuffer slice();
    public java.lang.String toString();
    public static java.nio.IntBuffer wrap(int[], int, int);
    public static java.nio.IntBuffer wrap(int[]);


}

-keep class java.nio.LongBuffer {

    public static java.nio.LongBuffer allocate(int);
    public long[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.LongBuffer asReadOnlyBuffer();
    public abstract java.nio.LongBuffer compact();
    public int compareTo(java.nio.LongBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.LongBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract long get();
    public abstract long get(int);
    public java.nio.LongBuffer get(long[], int, int);
    public java.nio.LongBuffer get(long[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.LongBuffer put(long);
    public abstract java.nio.LongBuffer put(int, long);
    public java.nio.LongBuffer put(java.nio.LongBuffer);
    public java.nio.LongBuffer put(long[], int, int);
    public java.nio.LongBuffer put(long[]);
    public abstract java.nio.LongBuffer slice();
    public java.lang.String toString();
    public static java.nio.LongBuffer wrap(long[], int, int);
    public static java.nio.LongBuffer wrap(long[]);


}

-keep class java.nio.MappedByteBuffer {

    public java.nio.MappedByteBuffer force();
    public boolean isLoaded();
    public java.nio.MappedByteBuffer load();


}

-keep class java.nio.ShortBuffer {

    public static java.nio.ShortBuffer allocate(int);
    public short[] array();
    public java.lang.Object array();
    public int arrayOffset();
    public abstract java.nio.ShortBuffer asReadOnlyBuffer();
    public abstract java.nio.ShortBuffer compact();
    public int compareTo(java.nio.ShortBuffer);
    public int compareTo(java.lang.Object);
    public abstract java.nio.ShortBuffer duplicate();
    public boolean equals(java.lang.Object);
    public abstract short get();
    public abstract short get(int);
    public java.nio.ShortBuffer get(short[], int, int);
    public java.nio.ShortBuffer get(short[]);
    public boolean hasArray();
    public int hashCode();
    public abstract boolean isDirect();
    public abstract java.nio.ByteOrder order();
    public abstract java.nio.ShortBuffer put(short);
    public abstract java.nio.ShortBuffer put(int, short);
    public java.nio.ShortBuffer put(java.nio.ShortBuffer);
    public java.nio.ShortBuffer put(short[], int, int);
    public java.nio.ShortBuffer put(short[]);
    public abstract java.nio.ShortBuffer slice();
    public java.lang.String toString();
    public static java.nio.ShortBuffer wrap(short[], int, int);
    public static java.nio.ShortBuffer wrap(short[]);


}

-keep class java.nio.channels.AsynchronousCloseException {
    <init>();



}

-keep class java.nio.channels.AsynchronousFileChannel {
    <init>();

    public abstract void force(boolean);
    public abstract void lock(long, long, boolean, java.lang.Object, java.nio.channels.CompletionHandler);
    public void lock(java.lang.Object, java.nio.channels.CompletionHandler);
    public abstract java.util.concurrent.Future lock(long, long, boolean);
    public java.util.concurrent.Future lock();
    public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute[]);
    public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption[]);
    public abstract void read(java.nio.ByteBuffer, long, java.lang.Object, java.nio.channels.CompletionHandler);
    public abstract java.util.concurrent.Future read(java.nio.ByteBuffer, long);
    public abstract long size();
    public abstract java.nio.channels.AsynchronousFileChannel truncate(long);
    public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
    public java.nio.channels.FileLock tryLock();
    public abstract void write(java.nio.ByteBuffer, long, java.lang.Object, java.nio.channels.CompletionHandler);
    public abstract java.util.concurrent.Future write(java.nio.ByteBuffer, long);


}

-keep class java.nio.channels.Channel {

    public abstract void close();
    public abstract boolean isOpen();


}

-keep class java.nio.channels.ClosedChannelException {
    <init>();



}

-keep class java.nio.channels.CompletionHandler {

    public abstract void completed(java.lang.Object, java.lang.Object);
    public abstract void failed(java.lang.Throwable, java.lang.Object);


}

-keep class java.nio.channels.DatagramChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.DatagramChannel bind(java.net.SocketAddress);
    public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress);
    public abstract java.nio.channels.DatagramChannel disconnect();
    public abstract java.net.SocketAddress getLocalAddress();
    public abstract java.net.SocketAddress getRemoteAddress();
    public abstract boolean isConnected();
    public static java.nio.channels.DatagramChannel open();
    public static java.nio.channels.DatagramChannel open(java.net.ProtocolFamily);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public long read(java.nio.ByteBuffer[]);
    public abstract java.net.SocketAddress receive(java.nio.ByteBuffer);
    public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress);
    public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, java.lang.Object);
    public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.net.DatagramSocket socket();
    public int validOps();
    public abstract int write(java.nio.ByteBuffer);
    public abstract long write(java.nio.ByteBuffer[], int, int);
    public long write(java.nio.ByteBuffer[]);


}

-keep class java.nio.channels.FileChannel {
    <init>();

    public abstract void force(boolean);
    public abstract java.nio.channels.FileLock lock(long, long, boolean);
    public java.nio.channels.FileLock lock();
    public abstract java.nio.MappedByteBuffer map(java.nio.channels.FileChannel$MapMode, long, long);
    public static java.nio.channels.FileChannel open(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
    public static java.nio.channels.FileChannel open(java.nio.file.Path, java.nio.file.OpenOption[]);
    public abstract long position();
    public abstract java.nio.channels.FileChannel position(long);
    public java.nio.channels.SeekableByteChannel position(long);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public long read(java.nio.ByteBuffer[]);
    public abstract int read(java.nio.ByteBuffer, long);
    public abstract long size();
    public abstract long transferFrom(java.nio.channels.ReadableByteChannel, long, long);
    public abstract long transferTo(long, long, java.nio.channels.WritableByteChannel);
    public abstract java.nio.channels.FileChannel truncate(long);
    public java.nio.channels.SeekableByteChannel truncate(long);
    public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
    public java.nio.channels.FileLock tryLock();
    public abstract int write(java.nio.ByteBuffer);
    public abstract long write(java.nio.ByteBuffer[], int, int);
    public long write(java.nio.ByteBuffer[]);
    public abstract int write(java.nio.ByteBuffer, long);


}

-keep class java.nio.channels.FileChannel$MapMode {

    public java.lang.String toString();


    public static java.nio.channels.FileChannel$MapMode PRIVATE;
    public static java.nio.channels.FileChannel$MapMode READ_ONLY;
    public static java.nio.channels.FileChannel$MapMode READ_WRITE;
}

-keep class java.nio.channels.FileLock {
    <init>(java.nio.channels.FileChannel, long, long, boolean);
    <init>(java.nio.channels.AsynchronousFileChannel, long, long, boolean);

    public java.nio.channels.Channel acquiredBy();
    public java.nio.channels.FileChannel channel();
    public void close();
    public boolean isShared();
    public abstract boolean isValid();
    public boolean overlaps(long, long);
    public long position();
    public abstract void release();
    public long size();
    public java.lang.String toString();


}

-keep class java.nio.channels.NetworkChannel {

    public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract java.net.SocketAddress getLocalAddress();
    public abstract java.lang.Object getOption(java.net.SocketOption);
    public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.util.Set supportedOptions();


}

-keep class java.nio.channels.Pipe {
    <init>();

    public static java.nio.channels.Pipe open();
    public abstract java.nio.channels.Pipe$SinkChannel sink();
    public abstract java.nio.channels.Pipe$SourceChannel source();


}

-keep class java.nio.channels.Pipe$SinkChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public int validOps();


}

-keep class java.nio.channels.Pipe$SourceChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public int validOps();


}

-keep class java.nio.channels.ReadableByteChannel {

    public abstract int read(java.nio.ByteBuffer);


}

-keep class java.nio.channels.SeekableByteChannel {

    public abstract long position();
    public abstract java.nio.channels.SeekableByteChannel position(long);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long size();
    public abstract java.nio.channels.SeekableByteChannel truncate(long);
    public abstract int write(java.nio.ByteBuffer);


}

-keep class java.nio.channels.SelectableChannel {
    <init>();

    public abstract java.lang.Object blockingLock();
    public abstract java.nio.channels.SelectableChannel configureBlocking(boolean);
    public abstract boolean isBlocking();
    public abstract boolean isRegistered();
    public abstract java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
    public abstract java.nio.channels.spi.SelectorProvider provider();
    public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int);
    public abstract int validOps();


}

-keep class java.nio.channels.SelectionKey {
    <init>();

    public java.lang.Object attach(java.lang.Object);
    public java.lang.Object attachment();
    public abstract void cancel();
    public abstract java.nio.channels.SelectableChannel channel();
    public abstract int interestOps();
    public abstract java.nio.channels.SelectionKey interestOps(int);
    public boolean isAcceptable();
    public boolean isConnectable();
    public boolean isReadable();
    public abstract boolean isValid();
    public boolean isWritable();
    public abstract int readyOps();
    public abstract java.nio.channels.Selector selector();


    public static int OP_ACCEPT;
    public static int OP_CONNECT;
    public static int OP_READ;
    public static int OP_WRITE;
}

-keep class java.nio.channels.Selector {
    <init>();

    public abstract void close();
    public abstract boolean isOpen();
    public abstract java.util.Set keys();
    public static java.nio.channels.Selector open();
    public abstract java.nio.channels.spi.SelectorProvider provider();
    public abstract int select(long);
    public abstract int select();
    public abstract int selectNow();
    public abstract java.util.Set selectedKeys();
    public abstract java.nio.channels.Selector wakeup();


}

-keep class java.nio.channels.ServerSocketChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.SocketChannel accept();
    public java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress);
    public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int);
    public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract java.net.SocketAddress getLocalAddress();
    public static java.nio.channels.ServerSocketChannel open();
    public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, java.lang.Object);
    public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.net.ServerSocket socket();
    public int validOps();


}

-keep class java.nio.channels.SocketChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public abstract java.nio.channels.SocketChannel bind(java.net.SocketAddress);
    public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
    public abstract boolean connect(java.net.SocketAddress);
    public abstract boolean finishConnect();
    public abstract java.net.SocketAddress getLocalAddress();
    public abstract java.net.SocketAddress getRemoteAddress();
    public abstract boolean isConnected();
    public abstract boolean isConnectionPending();
    public static java.nio.channels.SocketChannel open();
    public static java.nio.channels.SocketChannel open(java.net.SocketAddress);
    public abstract int read(java.nio.ByteBuffer);
    public abstract long read(java.nio.ByteBuffer[], int, int);
    public long read(java.nio.ByteBuffer[]);
    public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, java.lang.Object);
    public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
    public abstract java.nio.channels.SocketChannel shutdownInput();
    public abstract java.nio.channels.SocketChannel shutdownOutput();
    public abstract java.net.Socket socket();
    public int validOps();
    public abstract int write(java.nio.ByteBuffer);
    public abstract long write(java.nio.ByteBuffer[], int, int);
    public long write(java.nio.ByteBuffer[]);


}

-keep class java.nio.channels.WritableByteChannel {

    public abstract int write(java.nio.ByteBuffer);


}

-keep class java.nio.channels.spi.AbstractInterruptibleChannel {
    <init>();

    protected void begin();
    public void close();
    protected void end(boolean);
    protected abstract void implCloseChannel();
    public boolean isOpen();


}

-keep class java.nio.channels.spi.AbstractSelectableChannel {
    <init>(java.nio.channels.spi.SelectorProvider);

    public java.lang.Object blockingLock();
    public java.nio.channels.SelectableChannel configureBlocking(boolean);
    protected void implCloseChannel();
    protected abstract void implCloseSelectableChannel();
    protected abstract void implConfigureBlocking(boolean);
    public boolean isBlocking();
    public boolean isRegistered();
    public java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
    public java.nio.channels.spi.SelectorProvider provider();
    public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);


}

-keep class java.nio.channels.spi.AbstractSelectionKey {
    <init>();

    public void cancel();
    public boolean isValid();


}

-keep class java.nio.channels.spi.AbstractSelector {
    <init>(java.nio.channels.spi.SelectorProvider);

    protected void begin();
    protected java.util.Set cancelledKeys();
    public void close();
    protected void deregister(java.nio.channels.spi.AbstractSelectionKey);
    protected void end();
    protected abstract void implCloseSelector();
    public boolean isOpen();
    public java.nio.channels.spi.SelectorProvider provider();
    protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, java.lang.Object);


}

-keep class java.nio.channels.spi.SelectorProvider {
    <init>();

    public java.nio.channels.Channel inheritedChannel();
    public abstract java.nio.channels.DatagramChannel openDatagramChannel();
    public abstract java.nio.channels.DatagramChannel openDatagramChannel(java.net.ProtocolFamily);
    public abstract java.nio.channels.Pipe openPipe();
    public abstract java.nio.channels.spi.AbstractSelector openSelector();
    public abstract java.nio.channels.ServerSocketChannel openServerSocketChannel();
    public abstract java.nio.channels.SocketChannel openSocketChannel();
    public static java.nio.channels.spi.SelectorProvider provider();


}

-keep class java.nio.charset.CharacterCodingException {
    <init>();



}

-keep class java.nio.charset.Charset {
    <init>(java.lang.String, java.lang.String[]);

    public java.util.Set aliases();
    public static java.util.SortedMap availableCharsets();
    public boolean canEncode();
    public int compareTo(java.nio.charset.Charset);
    public int compareTo(java.lang.Object);
    public abstract boolean contains(java.nio.charset.Charset);
    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
    public static java.nio.charset.Charset defaultCharset();
    public java.lang.String displayName();
    public java.lang.String displayName(java.util.Locale);
    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
    public java.nio.ByteBuffer encode(java.lang.String);
    public boolean equals(java.lang.Object);
    public static java.nio.charset.Charset forName(java.lang.String);
    public static java.nio.charset.Charset forNameUEE(java.lang.String);
    public int hashCode();
    public boolean isRegistered();
    public static boolean isSupported(java.lang.String);
    public java.lang.String name();
    public abstract java.nio.charset.CharsetDecoder newDecoder();
    public abstract java.nio.charset.CharsetEncoder newEncoder();
    public java.lang.String toString();


}

-keep class java.nio.charset.CharsetDecoder {
    <init>(java.nio.charset.Charset, float, float);

    public float averageCharsPerByte();
    public java.nio.charset.Charset charset();
    public java.nio.charset.CoderResult decode(java.nio.ByteBuffer, java.nio.CharBuffer, boolean);
    public java.nio.CharBuffer decode(java.nio.ByteBuffer);
    protected abstract java.nio.charset.CoderResult decodeLoop(java.nio.ByteBuffer, java.nio.CharBuffer);
    public java.nio.charset.Charset detectedCharset();
    public java.nio.charset.CoderResult flush(java.nio.CharBuffer);
    protected java.nio.charset.CoderResult implFlush(java.nio.CharBuffer);
    protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
    protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
    protected void implReplaceWith(java.lang.String);
    protected void implReset();
    public boolean isAutoDetecting();
    public boolean isCharsetDetected();
    public java.nio.charset.CodingErrorAction malformedInputAction();
    public float maxCharsPerByte();
    public java.nio.charset.CharsetDecoder onMalformedInput(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetDecoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetDecoder replaceWith(java.lang.String);
    public java.lang.String replacement();
    public java.nio.charset.CharsetDecoder reset();
    public java.nio.charset.CodingErrorAction unmappableCharacterAction();


}

-keep class java.nio.charset.CharsetEncoder {
    <init>(java.nio.charset.Charset, float, float, byte[]);
    <init>(java.nio.charset.Charset, float, float);

    public float averageBytesPerChar();
    public boolean canEncode(char);
    public boolean canEncode(java.lang.CharSequence);
    public java.nio.charset.Charset charset();
    public java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
    public java.nio.ByteBuffer encode(java.nio.CharBuffer);
    protected abstract java.nio.charset.CoderResult encodeLoop(java.nio.CharBuffer, java.nio.ByteBuffer);
    public java.nio.charset.CoderResult flush(java.nio.ByteBuffer);
    protected java.nio.charset.CoderResult implFlush(java.nio.ByteBuffer);
    protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
    protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
    protected void implReplaceWith(byte[]);
    protected void implReset();
    public boolean isLegalReplacement(byte[]);
    public java.nio.charset.CodingErrorAction malformedInputAction();
    public float maxBytesPerChar();
    public java.nio.charset.CharsetEncoder onMalformedInput(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetEncoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
    public java.nio.charset.CharsetEncoder replaceWith(byte[]);
    public byte[] replacement();
    public java.nio.charset.CharsetEncoder reset();
    public java.nio.charset.CodingErrorAction unmappableCharacterAction();


}

-keep class java.nio.charset.CoderResult {

    public boolean isError();
    public boolean isMalformed();
    public boolean isOverflow();
    public boolean isUnderflow();
    public boolean isUnmappable();
    public int length();
    public static java.nio.charset.CoderResult malformedForLength(int);
    public void throwException();
    public java.lang.String toString();
    public static java.nio.charset.CoderResult unmappableForLength(int);


    public static java.nio.charset.CoderResult OVERFLOW;
    public static java.nio.charset.CoderResult UNDERFLOW;
}

-keep class java.nio.charset.CodingErrorAction {

    public java.lang.String toString();


    public static java.nio.charset.CodingErrorAction IGNORE;
    public static java.nio.charset.CodingErrorAction REPLACE;
    public static java.nio.charset.CodingErrorAction REPORT;
}

-keep class java.nio.file.AccessMode {

    public static java.nio.file.AccessMode valueOf(java.lang.String);
    public static java.nio.file.AccessMode[] values();

    public static java.nio.file.AccessMode EXECUTE;
    public static java.nio.file.AccessMode READ;
    public static java.nio.file.AccessMode WRITE;

}

-keep class java.nio.file.CopyOption {



}

-keep class java.nio.file.DirectoryStream {

    public abstract java.util.Iterator iterator();


}

-keep class java.nio.file.DirectoryStream$Filter {

    public abstract boolean accept(java.lang.Object);


}

-keep class java.nio.file.FileStore {
    <init>();

    public abstract java.lang.Object getAttribute(java.lang.String);
    public abstract java.nio.file.attribute.FileStoreAttributeView getFileStoreAttributeView(java.lang.Class);
    public abstract long getTotalSpace();
    public abstract long getUnallocatedSpace();
    public abstract long getUsableSpace();
    public abstract boolean isReadOnly();
    public abstract java.lang.String name();
    public abstract boolean supportsFileAttributeView(java.lang.Class);
    public abstract boolean supportsFileAttributeView(java.lang.String);
    public abstract java.lang.String type();


}

-keep class java.nio.file.FileSystem {
    <init>();

    public abstract void close();
    public abstract java.lang.Iterable getFileStores();
    public abstract java.nio.file.Path getPath(java.lang.String, java.lang.String[]);
    public abstract java.nio.file.PathMatcher getPathMatcher(java.lang.String);
    public abstract java.lang.Iterable getRootDirectories();
    public abstract java.lang.String getSeparator();
    public abstract java.nio.file.attribute.UserPrincipalLookupService getUserPrincipalLookupService();
    public abstract boolean isOpen();
    public abstract boolean isReadOnly();
    public abstract java.nio.file.WatchService newWatchService();
    public abstract java.nio.file.spi.FileSystemProvider provider();
    public abstract java.util.Set supportedFileAttributeViews();


}

-keep class java.nio.file.LinkOption {

    public static java.nio.file.LinkOption valueOf(java.lang.String);
    public static java.nio.file.LinkOption[] values();

    public static java.nio.file.LinkOption NOFOLLOW_LINKS;

}

-keep class java.nio.file.OpenOption {



}

-keep class java.nio.file.Path {

    public abstract int compareTo(java.nio.file.Path);
    public int compareTo(java.lang.Object);
    public abstract boolean endsWith(java.nio.file.Path);
    public abstract boolean endsWith(java.lang.String);
    public abstract boolean equals(java.lang.Object);
    public abstract java.nio.file.Path getFileName();
    public abstract java.nio.file.FileSystem getFileSystem();
    public abstract java.nio.file.Path getName(int);
    public abstract int getNameCount();
    public abstract java.nio.file.Path getParent();
    public abstract java.nio.file.Path getRoot();
    public abstract int hashCode();
    public abstract boolean isAbsolute();
    public abstract java.util.Iterator iterator();
    public abstract java.nio.file.Path normalize();
    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[], java.nio.file.WatchEvent$Modifier[]);
    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[]);
    public abstract java.nio.file.Path relativize(java.nio.file.Path);
    public abstract java.nio.file.Path resolve(java.nio.file.Path);
    public abstract java.nio.file.Path resolve(java.lang.String);
    public abstract java.nio.file.Path resolveSibling(java.nio.file.Path);
    public abstract java.nio.file.Path resolveSibling(java.lang.String);
    public abstract boolean startsWith(java.nio.file.Path);
    public abstract boolean startsWith(java.lang.String);
    public abstract java.nio.file.Path subpath(int, int);
    public abstract java.nio.file.Path toAbsolutePath();
    public abstract java.io.File toFile();
    public abstract java.nio.file.Path toRealPath(java.nio.file.LinkOption[]);
    public abstract java.lang.String toString();
    public abstract java.net.URI toUri();


}

-keep class java.nio.file.PathMatcher {

    public abstract boolean matches(java.nio.file.Path);


}

-keep class java.nio.file.WatchEvent {

    public abstract java.lang.Object context();
    public abstract int count();
    public abstract java.nio.file.WatchEvent$Kind kind();


}

-keep class java.nio.file.WatchEvent$Kind {

    public abstract java.lang.String name();
    public abstract java.lang.Class type();


}

-keep class java.nio.file.WatchEvent$Modifier {

    public abstract java.lang.String name();


}

-keep class java.nio.file.WatchKey {

    public abstract void cancel();
    public abstract boolean isValid();
    public abstract java.util.List pollEvents();
    public abstract boolean reset();
    public abstract java.nio.file.Watchable watchable();


}

-keep class java.nio.file.WatchService {

    public abstract void close();
    public abstract java.nio.file.WatchKey poll();
    public abstract java.nio.file.WatchKey poll(long, java.util.concurrent.TimeUnit);
    public abstract java.nio.file.WatchKey take();


}

-keep class java.nio.file.Watchable {

    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[], java.nio.file.WatchEvent$Modifier[]);
    public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[]);


}

-keep class java.nio.file.attribute.BasicFileAttributes {

    public abstract java.nio.file.attribute.FileTime creationTime();
    public abstract java.lang.Object fileKey();
    public abstract boolean isDirectory();
    public abstract boolean isOther();
    public abstract boolean isRegularFile();
    public abstract boolean isSymbolicLink();
    public abstract java.nio.file.attribute.FileTime lastAccessTime();
    public abstract java.nio.file.attribute.FileTime lastModifiedTime();
    public abstract long size();


}

-keep class java.nio.file.attribute.FileAttribute {

    public abstract java.lang.String name();
    public abstract java.lang.Object value();


}

-keep class java.nio.file.attribute.FileAttributeView {



}

-keep class java.nio.file.attribute.FileStoreAttributeView {



}

-keep class java.nio.file.attribute.FileTime {

    public int compareTo(java.nio.file.attribute.FileTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.nio.file.attribute.FileTime from(long, java.util.concurrent.TimeUnit);
    public static java.nio.file.attribute.FileTime from(java.time.Instant);
    public static java.nio.file.attribute.FileTime fromMillis(long);
    public int hashCode();
    public long to(java.util.concurrent.TimeUnit);
    public java.time.Instant toInstant();
    public long toMillis();
    public java.lang.String toString();


}

-keep class java.nio.file.attribute.GroupPrincipal {



}

-keep class java.nio.file.attribute.UserPrincipal {



}

-keep class java.nio.file.attribute.UserPrincipalLookupService {
    <init>();

    public abstract java.nio.file.attribute.GroupPrincipal lookupPrincipalByGroupName(java.lang.String);
    public abstract java.nio.file.attribute.UserPrincipal lookupPrincipalByName(java.lang.String);


}

-keep class java.nio.file.spi.FileSystemProvider {
    <init>();

    public abstract void checkAccess(java.nio.file.Path, java.nio.file.AccessMode[]);
    public abstract void copy(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption[]);
    public abstract void createDirectory(java.nio.file.Path, java.nio.file.attribute.FileAttribute[]);
    public void createLink(java.nio.file.Path, java.nio.file.Path);
    public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute[]);
    public abstract void delete(java.nio.file.Path);
    public boolean deleteIfExists(java.nio.file.Path);
    public abstract java.nio.file.attribute.FileAttributeView getFileAttributeView(java.nio.file.Path, java.lang.Class, java.nio.file.LinkOption[]);
    public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path);
    public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
    public abstract java.nio.file.Path getPath(java.net.URI);
    public abstract java.lang.String getScheme();
    public static java.util.List installedProviders();
    public abstract boolean isHidden(java.nio.file.Path);
    public abstract boolean isSameFile(java.nio.file.Path, java.nio.file.Path);
    public abstract void move(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption[]);
    public java.nio.channels.AsynchronousFileChannel newAsynchronousFileChannel(java.nio.file.Path, java.util.Set, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute[]);
    public abstract java.nio.channels.SeekableByteChannel newByteChannel(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
    public abstract java.nio.file.DirectoryStream newDirectoryStream(java.nio.file.Path, java.nio.file.DirectoryStream$Filter);
    public java.nio.channels.FileChannel newFileChannel(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
    public abstract java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map);
    public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map);
    public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption[]);
    public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption[]);
    public abstract java.nio.file.attribute.BasicFileAttributes readAttributes(java.nio.file.Path, java.lang.Class, java.nio.file.LinkOption[]);
    public abstract java.util.Map readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption[]);
    public java.nio.file.Path readSymbolicLink(java.nio.file.Path);
    public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption[]);


}

-keep class java.security.AccessControlContext {
    <init>(java.security.ProtectionDomain[]);
    <init>(java.security.AccessControlContext, java.security.DomainCombiner);

    public void checkPermission(java.security.Permission);
    public java.security.DomainCombiner getDomainCombiner();


}

-keep class java.security.AccessControlException {
    <init>(java.lang.String);
    <init>(java.lang.String, java.security.Permission);

    public java.security.Permission getPermission();


}

-keep class java.security.CodeSigner {
    <init>(java.security.cert.CertPath, java.security.Timestamp);

    public boolean equals(java.lang.Object);
    public java.security.cert.CertPath getSignerCertPath();
    public java.security.Timestamp getTimestamp();
    public int hashCode();
    public java.lang.String toString();


}

-keep class java.security.CodeSource {
    <init>(java.net.URL, java.security.cert.Certificate[]);
    <init>(java.net.URL, java.security.CodeSigner[]);

    public java.security.cert.Certificate[] getCertificates();
    public java.security.CodeSigner[] getCodeSigners();
    public java.net.URL getLocation();
    public boolean implies(java.security.CodeSource);


}

-keep class java.security.DomainCombiner {

    public abstract java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);


}

-keep class java.security.GeneralSecurityException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.InvalidKeyException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.KeyException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.NoSuchAlgorithmException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.NoSuchProviderException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.security.Permission {
    <init>(java.lang.String);

    public void checkGuard(java.lang.Object);
    public abstract java.lang.String getActions();
    public java.lang.String getName();
    public abstract boolean implies(java.security.Permission);
    public java.security.PermissionCollection newPermissionCollection();


}

-keep class java.security.PermissionCollection {
    <init>();

    public abstract void add(java.security.Permission);
    public abstract java.util.Enumeration elements();
    public abstract boolean implies(java.security.Permission);
    public boolean isReadOnly();
    public void setReadOnly();


}

-keep class java.security.Principal {

    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.String getName();
    public abstract int hashCode();
    public boolean implies(javax.security.auth.Subject);
    public abstract java.lang.String toString();


}

-keep class java.security.PrivilegedAction {

    public abstract java.lang.Object run();


}

-keep class java.security.PrivilegedActionException {
    <init>(java.lang.Exception);

    public java.lang.Throwable getCause();
    public java.lang.Exception getException();
    public java.lang.String toString();


}

-keep class java.security.PrivilegedExceptionAction {

    public abstract java.lang.Object run();


}

-keep class java.security.ProtectionDomain {
    <init>(java.security.CodeSource, java.security.PermissionCollection);
    <init>(java.security.CodeSource, java.security.PermissionCollection, java.lang.ClassLoader, java.security.Principal[]);

    public java.lang.ClassLoader getClassLoader();
    public java.security.CodeSource getCodeSource();
    public java.security.PermissionCollection getPermissions();
    public java.security.Principal[] getPrincipals();
    public boolean implies(java.security.Permission);


}

-keep class java.security.Provider {
    <init>(java.lang.String, double, java.lang.String);

    public synchronized void clear();
    public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public java.util.Enumeration elements();
    public synchronized java.util.Set entrySet();
    public synchronized void forEach(java.util.function.BiConsumer);
    public java.lang.Object get(java.lang.Object);
    public java.lang.String getInfo();
    public java.lang.String getName();
    public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public java.lang.String getProperty(java.lang.String);
    public synchronized java.security.Provider$Service getService(java.lang.String, java.lang.String);
    public synchronized java.util.Set getServices();
    public double getVersion();
    public boolean isRegistered();
    public java.util.Set keySet();
    public java.util.Enumeration keys();
    public synchronized void load(java.io.InputStream);
    public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
    public synchronized void putAll(java.util.Map);
    public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    protected synchronized void putService(java.security.Provider$Service);
    public synchronized java.lang.Object remove(java.lang.Object);
    public synchronized boolean remove(java.lang.Object, java.lang.Object);
    protected synchronized void removeService(java.security.Provider$Service);
    public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
    public synchronized void replaceAll(java.util.function.BiFunction);
    public void setRegistered();
    public void setUnregistered();
    public java.lang.String toString();
    public java.util.Collection values();
    public synchronized void warmUpServiceProvision();


}

-keep class java.security.Provider$Service {
    <init>(java.security.Provider, java.lang.String, java.lang.String, java.lang.String, java.util.List, java.util.Map);

    public java.lang.String getAlgorithm();
    public java.lang.String getAttribute(java.lang.String);
    public java.lang.String getClassName();
    public java.security.Provider getProvider();
    public java.lang.String getType();
    public java.lang.Object newInstance(java.lang.Object);
    public boolean supportsParameter(java.lang.Object);
    public java.lang.String toString();


}

-keep class java.security.PublicKey {



    public static long serialVersionUID;
}

-keep class java.security.SignatureException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.Timestamp {
    <init>(java.util.Date, java.security.cert.CertPath);

    public boolean equals(java.lang.Object);
    public java.security.cert.CertPath getSignerCertPath();
    public java.util.Date getTimestamp();
    public int hashCode();
    public java.lang.String toString();


}

-keep class java.security.cert.CRL {
    <init>(java.lang.String);

    public java.lang.String getType();
    public abstract boolean isRevoked(java.security.cert.Certificate);
    public abstract java.lang.String toString();


}

-keep class java.security.cert.CRLException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.cert.CertPath {
    <init>(java.lang.String);

    public boolean equals(java.lang.Object);
    public abstract java.util.List getCertificates();
    public abstract byte[] getEncoded();
    public abstract byte[] getEncoded(java.lang.String);
    public abstract java.util.Iterator getEncodings();
    public java.lang.String getType();
    public int hashCode();
    public java.lang.String toString();
    protected java.lang.Object writeReplace();


}

-keep class java.security.cert.Certificate {
    <init>(java.lang.String);

    public boolean equals(java.lang.Object);
    public abstract byte[] getEncoded();
    public abstract java.security.PublicKey getPublicKey();
    public java.lang.String getType();
    public int hashCode();
    public abstract java.lang.String toString();
    public abstract void verify(java.security.PublicKey);
    public abstract void verify(java.security.PublicKey, java.lang.String);
    public void verify(java.security.PublicKey, java.security.Provider);
    protected java.lang.Object writeReplace();


}

-keep class java.security.cert.CertificateEncodingException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.cert.CertificateException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.security.cert.CertificateFactory {
    <init>(java.security.cert.CertificateFactorySpi, java.security.Provider, java.lang.String);

    public java.security.cert.CRL generateCRL(java.io.InputStream);
    public java.util.Collection generateCRLs(java.io.InputStream);
    public java.security.cert.CertPath generateCertPath(java.io.InputStream);
    public java.security.cert.CertPath generateCertPath(java.io.InputStream, java.lang.String);
    public java.security.cert.CertPath generateCertPath(java.util.List);
    public java.security.cert.Certificate generateCertificate(java.io.InputStream);
    public java.util.Collection generateCertificates(java.io.InputStream);
    public java.util.Iterator getCertPathEncodings();
    public static java.security.cert.CertificateFactory getInstance(java.lang.String);
    public static java.security.cert.CertificateFactory getInstance(java.lang.String, java.lang.String);
    public static java.security.cert.CertificateFactory getInstance(java.lang.String, java.security.Provider);
    public java.security.Provider getProvider();
    public java.lang.String getType();


}

-keep class java.security.cert.CertificateFactorySpi {
    <init>();

    public abstract java.security.cert.CRL engineGenerateCRL(java.io.InputStream);
    public abstract java.util.Collection engineGenerateCRLs(java.io.InputStream);
    public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream);
    public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream, java.lang.String);
    public java.security.cert.CertPath engineGenerateCertPath(java.util.List);
    public abstract java.security.cert.Certificate engineGenerateCertificate(java.io.InputStream);
    public abstract java.util.Collection engineGenerateCertificates(java.io.InputStream);
    public java.util.Iterator engineGetCertPathEncodings();


}

-keep class java.text.AttributedCharacterIterator {

    public abstract java.util.Set getAllAttributeKeys();
    public abstract java.lang.Object getAttribute(java.text.AttributedCharacterIterator$Attribute);
    public abstract java.util.Map getAttributes();
    public abstract int getRunLimit();
    public abstract int getRunLimit(java.text.AttributedCharacterIterator$Attribute);
    public abstract int getRunLimit(java.util.Set);
    public abstract int getRunStart();
    public abstract int getRunStart(java.text.AttributedCharacterIterator$Attribute);
    public abstract int getRunStart(java.util.Set);


}

-keep class java.text.AttributedCharacterIterator$Attribute {
    <init>(java.lang.String);

    public boolean equals(java.lang.Object);
    protected java.lang.String getName();
    public int hashCode();
    protected java.lang.Object readResolve();
    public java.lang.String toString();


    public static java.text.AttributedCharacterIterator$Attribute INPUT_METHOD_SEGMENT;
    public static java.text.AttributedCharacterIterator$Attribute LANGUAGE;
    public static java.text.AttributedCharacterIterator$Attribute READING;
}

-keep class java.text.FieldPosition {
    <init>(int);
    <init>(java.text.Format$Field);
    <init>(java.text.Format$Field, int);

    public boolean equals(java.lang.Object);
    public int getBeginIndex();
    public int getEndIndex();
    public int getField();
    public java.text.Format$Field getFieldAttribute();
    public int hashCode();
    public void setBeginIndex(int);
    public void setEndIndex(int);
    public java.lang.String toString();


}

-keep class java.text.Format {
    <init>();

    public java.lang.Object clone();
    public java.lang.String format(java.lang.Object);
    public abstract java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
    public java.text.AttributedCharacterIterator formatToCharacterIterator(java.lang.Object);
    public abstract java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
    public java.lang.Object parseObject(java.lang.String);


}

-keep class java.text.Format$Field {
    <init>(java.lang.String);



}

-keep class java.text.ParseException {
    <init>(java.lang.String, int);

    public int getErrorOffset();


}

-keep class java.text.ParsePosition {
    <init>(int);

    public boolean equals(java.lang.Object);
    public int getErrorIndex();
    public int getIndex();
    public int hashCode();
    public void setErrorIndex(int);
    public void setIndex(int);
    public java.lang.String toString();


}

-keep class java.time.Clock {
    <init>();

    public boolean equals(java.lang.Object);
    public static java.time.Clock fixed(java.time.Instant, java.time.ZoneId);
    public abstract java.time.ZoneId getZone();
    public int hashCode();
    public abstract java.time.Instant instant();
    public long millis();
    public static java.time.Clock offset(java.time.Clock, java.time.Duration);
    public static java.time.Clock system(java.time.ZoneId);
    public static java.time.Clock systemDefaultZone();
    public static java.time.Clock systemUTC();
    public static java.time.Clock tick(java.time.Clock, java.time.Duration);
    public static java.time.Clock tickMinutes(java.time.ZoneId);
    public static java.time.Clock tickSeconds(java.time.ZoneId);
    public abstract java.time.Clock withZone(java.time.ZoneId);


}

-keep class java.time.DayOfWeek {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public long getLong(java.time.temporal.TemporalField);
    public int getValue();
    public boolean isSupported(java.time.temporal.TemporalField);
    public java.time.DayOfWeek minus(long);
    public static java.time.DayOfWeek of(int);
    public java.time.DayOfWeek plus(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.time.DayOfWeek valueOf(java.lang.String);
    public static java.time.DayOfWeek[] values();

    public static java.time.DayOfWeek FRIDAY;
    public static java.time.DayOfWeek MONDAY;
    public static java.time.DayOfWeek SATURDAY;
    public static java.time.DayOfWeek SUNDAY;
    public static java.time.DayOfWeek THURSDAY;
    public static java.time.DayOfWeek TUESDAY;
    public static java.time.DayOfWeek WEDNESDAY;

}

-keep class java.time.Duration {

    public java.time.Duration abs();
    public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public static java.time.Duration between(java.time.temporal.Temporal, java.time.temporal.Temporal);
    public int compareTo(java.time.Duration);
    public int compareTo(java.lang.Object);
    public java.time.Duration dividedBy(long);
    public boolean equals(java.lang.Object);
    public static java.time.Duration from(java.time.temporal.TemporalAmount);
    public long get(java.time.temporal.TemporalUnit);
    public int getNano();
    public long getSeconds();
    public java.util.List getUnits();
    public int hashCode();
    public boolean isNegative();
    public boolean isZero();
    public java.time.Duration minus(java.time.Duration);
    public java.time.Duration minus(long, java.time.temporal.TemporalUnit);
    public java.time.Duration minusDays(long);
    public java.time.Duration minusHours(long);
    public java.time.Duration minusMillis(long);
    public java.time.Duration minusMinutes(long);
    public java.time.Duration minusNanos(long);
    public java.time.Duration minusSeconds(long);
    public java.time.Duration multipliedBy(long);
    public java.time.Duration negated();
    public static java.time.Duration of(long, java.time.temporal.TemporalUnit);
    public static java.time.Duration ofDays(long);
    public static java.time.Duration ofHours(long);
    public static java.time.Duration ofMillis(long);
    public static java.time.Duration ofMinutes(long);
    public static java.time.Duration ofNanos(long);
    public static java.time.Duration ofSeconds(long);
    public static java.time.Duration ofSeconds(long, long);
    public static java.time.Duration parse(java.lang.CharSequence);
    public java.time.Duration plus(java.time.Duration);
    public java.time.Duration plus(long, java.time.temporal.TemporalUnit);
    public java.time.Duration plusDays(long);
    public java.time.Duration plusHours(long);
    public java.time.Duration plusMillis(long);
    public java.time.Duration plusMinutes(long);
    public java.time.Duration plusNanos(long);
    public java.time.Duration plusSeconds(long);
    public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
    public long toDays();
    public long toHours();
    public long toMillis();
    public long toMinutes();
    public long toNanos();
    public java.lang.String toString();
    public java.time.Duration withNanos(int);
    public java.time.Duration withSeconds(long);


    public static java.time.Duration ZERO;
}

-keep class java.time.Instant {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
    public java.time.ZonedDateTime atZone(java.time.ZoneId);
    public int compareTo(java.time.Instant);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.time.Instant from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public long getEpochSecond();
    public long getLong(java.time.temporal.TemporalField);
    public int getNano();
    public int hashCode();
    public boolean isAfter(java.time.Instant);
    public boolean isBefore(java.time.Instant);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.Instant minus(java.time.temporal.TemporalAmount);
    public java.time.Instant minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.Instant minusMillis(long);
    public java.time.Instant minusNanos(long);
    public java.time.Instant minusSeconds(long);
    public static java.time.Instant now();
    public static java.time.Instant now(java.time.Clock);
    public static java.time.Instant ofEpochMilli(long);
    public static java.time.Instant ofEpochSecond(long);
    public static java.time.Instant ofEpochSecond(long, long);
    public static java.time.Instant parse(java.lang.CharSequence);
    public java.time.Instant plus(java.time.temporal.TemporalAmount);
    public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.Instant plusMillis(long);
    public java.time.Instant plusNanos(long);
    public java.time.Instant plusSeconds(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public long toEpochMilli();
    public java.lang.String toString();
    public java.time.Instant truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.Instant with(java.time.temporal.TemporalAdjuster);
    public java.time.Instant with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);


    public static java.time.Instant EPOCH;
    public static java.time.Instant MAX;
    public static java.time.Instant MIN;
}

-keep class java.time.LocalDate {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.LocalDateTime atStartOfDay();
    public java.time.ZonedDateTime atStartOfDay(java.time.ZoneId);
    public java.time.LocalDateTime atTime(java.time.LocalTime);
    public java.time.LocalDateTime atTime(int, int);
    public java.time.LocalDateTime atTime(int, int, int);
    public java.time.LocalDateTime atTime(int, int, int, int);
    public java.time.OffsetDateTime atTime(java.time.OffsetTime);
    public java.time.chrono.ChronoLocalDateTime atTime(java.time.LocalTime);
    public int compareTo(java.time.chrono.ChronoLocalDate);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.LocalDate from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.time.chrono.IsoChronology getChronology();
    public java.time.chrono.Chronology getChronology();
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public java.time.chrono.Era getEra();
    public long getLong(java.time.temporal.TemporalField);
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getYear();
    public int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDate);
    public boolean isBefore(java.time.chrono.ChronoLocalDate);
    public boolean isEqual(java.time.chrono.ChronoLocalDate);
    public boolean isLeapYear();
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public int lengthOfMonth();
    public int lengthOfYear();
    public java.time.LocalDate minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate minusDays(long);
    public java.time.LocalDate minusMonths(long);
    public java.time.LocalDate minusWeeks(long);
    public java.time.LocalDate minusYears(long);
    public static java.time.LocalDate now();
    public static java.time.LocalDate now(java.time.ZoneId);
    public static java.time.LocalDate now(java.time.Clock);
    public static java.time.LocalDate of(int, java.time.Month, int);
    public static java.time.LocalDate of(int, int, int);
    public static java.time.LocalDate ofEpochDay(long);
    public static java.time.LocalDate ofYearDay(int, int);
    public static java.time.LocalDate parse(java.lang.CharSequence);
    public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDate plusDays(long);
    public java.time.LocalDate plusMonths(long);
    public java.time.LocalDate plusWeeks(long);
    public java.time.LocalDate plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public long toEpochDay();
    public java.lang.String toString();
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.Period until(java.time.chrono.ChronoLocalDate);
    public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
    public java.time.LocalDate with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDate with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDate withDayOfMonth(int);
    public java.time.LocalDate withDayOfYear(int);
    public java.time.LocalDate withMonth(int);
    public java.time.LocalDate withYear(int);


    public static java.time.LocalDate MAX;
    public static java.time.LocalDate MIN;
}

-keep class java.time.LocalDateTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
    public java.time.ZonedDateTime atZone(java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime atZone(java.time.ZoneId);
    public int compareTo(java.time.chrono.ChronoLocalDateTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.LocalDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getNano();
    public int getSecond();
    public int getYear();
    public int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDateTime);
    public boolean isBefore(java.time.chrono.ChronoLocalDateTime);
    public boolean isEqual(java.time.chrono.ChronoLocalDateTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.LocalDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime minusDays(long);
    public java.time.LocalDateTime minusHours(long);
    public java.time.LocalDateTime minusMinutes(long);
    public java.time.LocalDateTime minusMonths(long);
    public java.time.LocalDateTime minusNanos(long);
    public java.time.LocalDateTime minusSeconds(long);
    public java.time.LocalDateTime minusWeeks(long);
    public java.time.LocalDateTime minusYears(long);
    public static java.time.LocalDateTime now();
    public static java.time.LocalDateTime now(java.time.ZoneId);
    public static java.time.LocalDateTime now(java.time.Clock);
    public static java.time.LocalDateTime of(int, java.time.Month, int, int, int);
    public static java.time.LocalDateTime of(int, java.time.Month, int, int, int, int);
    public static java.time.LocalDateTime of(int, java.time.Month, int, int, int, int, int);
    public static java.time.LocalDateTime of(int, int, int, int, int);
    public static java.time.LocalDateTime of(int, int, int, int, int, int);
    public static java.time.LocalDateTime of(int, int, int, int, int, int, int);
    public static java.time.LocalDateTime of(java.time.LocalDate, java.time.LocalTime);
    public static java.time.LocalDateTime ofEpochSecond(long, int, java.time.ZoneOffset);
    public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.LocalDateTime parse(java.lang.CharSequence);
    public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.LocalDateTime plusDays(long);
    public java.time.LocalDateTime plusHours(long);
    public java.time.LocalDateTime plusMinutes(long);
    public java.time.LocalDateTime plusMonths(long);
    public java.time.LocalDateTime plusNanos(long);
    public java.time.LocalDateTime plusSeconds(long);
    public java.time.LocalDateTime plusWeeks(long);
    public java.time.LocalDateTime plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.time.LocalDate toLocalDate();
    public java.time.chrono.ChronoLocalDate toLocalDate();
    public java.time.LocalTime toLocalTime();
    public java.lang.String toString();
    public java.time.LocalDateTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.LocalDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalField, long);
    public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalDateTime withDayOfMonth(int);
    public java.time.LocalDateTime withDayOfYear(int);
    public java.time.LocalDateTime withHour(int);
    public java.time.LocalDateTime withMinute(int);
    public java.time.LocalDateTime withMonth(int);
    public java.time.LocalDateTime withNano(int);
    public java.time.LocalDateTime withSecond(int);
    public java.time.LocalDateTime withYear(int);


    public static java.time.LocalDateTime MAX;
    public static java.time.LocalDateTime MIN;
}

-keep class java.time.LocalTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.LocalDateTime atDate(java.time.LocalDate);
    public java.time.OffsetTime atOffset(java.time.ZoneOffset);
    public int compareTo(java.time.LocalTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.LocalTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public int getNano();
    public int getSecond();
    public int hashCode();
    public boolean isAfter(java.time.LocalTime);
    public boolean isBefore(java.time.LocalTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime minusHours(long);
    public java.time.LocalTime minusMinutes(long);
    public java.time.LocalTime minusNanos(long);
    public java.time.LocalTime minusSeconds(long);
    public static java.time.LocalTime now();
    public static java.time.LocalTime now(java.time.ZoneId);
    public static java.time.LocalTime now(java.time.Clock);
    public static java.time.LocalTime of(int, int);
    public static java.time.LocalTime of(int, int, int);
    public static java.time.LocalTime of(int, int, int, int);
    public static java.time.LocalTime ofNanoOfDay(long);
    public static java.time.LocalTime ofSecondOfDay(long);
    public static java.time.LocalTime parse(java.lang.CharSequence);
    public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.LocalTime plusHours(long);
    public java.time.LocalTime plusMinutes(long);
    public java.time.LocalTime plusNanos(long);
    public java.time.LocalTime plusSeconds(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public long toNanoOfDay();
    public int toSecondOfDay();
    public java.lang.String toString();
    public java.time.LocalTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.LocalTime with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.LocalTime withHour(int);
    public java.time.LocalTime withMinute(int);
    public java.time.LocalTime withNano(int);
    public java.time.LocalTime withSecond(int);


    public static java.time.LocalTime MAX;
    public static java.time.LocalTime MIDNIGHT;
    public static java.time.LocalTime MIN;
    public static java.time.LocalTime NOON;
}

-keep class java.time.Month {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public int firstDayOfYear(boolean);
    public java.time.Month firstMonthOfQuarter();
    public static java.time.Month from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public long getLong(java.time.temporal.TemporalField);
    public int getValue();
    public boolean isSupported(java.time.temporal.TemporalField);
    public int length(boolean);
    public int maxLength();
    public int minLength();
    public java.time.Month minus(long);
    public static java.time.Month of(int);
    public java.time.Month plus(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.time.Month valueOf(java.lang.String);
    public static java.time.Month[] values();

    public static java.time.Month APRIL;
    public static java.time.Month AUGUST;
    public static java.time.Month DECEMBER;
    public static java.time.Month FEBRUARY;
    public static java.time.Month JANUARY;
    public static java.time.Month JULY;
    public static java.time.Month JUNE;
    public static java.time.Month MARCH;
    public static java.time.Month MAY;
    public static java.time.Month NOVEMBER;
    public static java.time.Month OCTOBER;
    public static java.time.Month SEPTEMBER;

}

-keep class java.time.OffsetDateTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.ZonedDateTime atZoneSameInstant(java.time.ZoneId);
    public java.time.ZonedDateTime atZoneSimilarLocal(java.time.ZoneId);
    public int compareTo(java.time.OffsetDateTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.OffsetDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getNano();
    public java.time.ZoneOffset getOffset();
    public int getSecond();
    public int getYear();
    public int hashCode();
    public boolean isAfter(java.time.OffsetDateTime);
    public boolean isBefore(java.time.OffsetDateTime);
    public boolean isEqual(java.time.OffsetDateTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.OffsetDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime minusDays(long);
    public java.time.OffsetDateTime minusHours(long);
    public java.time.OffsetDateTime minusMinutes(long);
    public java.time.OffsetDateTime minusMonths(long);
    public java.time.OffsetDateTime minusNanos(long);
    public java.time.OffsetDateTime minusSeconds(long);
    public java.time.OffsetDateTime minusWeeks(long);
    public java.time.OffsetDateTime minusYears(long);
    public static java.time.OffsetDateTime now();
    public static java.time.OffsetDateTime now(java.time.ZoneId);
    public static java.time.OffsetDateTime now(java.time.Clock);
    public static java.time.OffsetDateTime of(java.time.LocalDate, java.time.LocalTime, java.time.ZoneOffset);
    public static java.time.OffsetDateTime of(java.time.LocalDateTime, java.time.ZoneOffset);
    public static java.time.OffsetDateTime of(int, int, int, int, int, int, int, java.time.ZoneOffset);
    public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.OffsetDateTime parse(java.lang.CharSequence);
    public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetDateTime plusDays(long);
    public java.time.OffsetDateTime plusHours(long);
    public java.time.OffsetDateTime plusMinutes(long);
    public java.time.OffsetDateTime plusMonths(long);
    public java.time.OffsetDateTime plusNanos(long);
    public java.time.OffsetDateTime plusSeconds(long);
    public java.time.OffsetDateTime plusWeeks(long);
    public java.time.OffsetDateTime plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.util.Comparator timeLineOrder();
    public long toEpochSecond();
    public java.time.Instant toInstant();
    public java.time.LocalDate toLocalDate();
    public java.time.LocalDateTime toLocalDateTime();
    public java.time.LocalTime toLocalTime();
    public java.time.OffsetTime toOffsetTime();
    public java.lang.String toString();
    public java.time.ZonedDateTime toZonedDateTime();
    public java.time.OffsetDateTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.OffsetDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetDateTime withDayOfMonth(int);
    public java.time.OffsetDateTime withDayOfYear(int);
    public java.time.OffsetDateTime withHour(int);
    public java.time.OffsetDateTime withMinute(int);
    public java.time.OffsetDateTime withMonth(int);
    public java.time.OffsetDateTime withNano(int);
    public java.time.OffsetDateTime withOffsetSameInstant(java.time.ZoneOffset);
    public java.time.OffsetDateTime withOffsetSameLocal(java.time.ZoneOffset);
    public java.time.OffsetDateTime withSecond(int);
    public java.time.OffsetDateTime withYear(int);


    public static java.time.OffsetDateTime MAX;
    public static java.time.OffsetDateTime MIN;
}

-keep class java.time.OffsetTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.OffsetDateTime atDate(java.time.LocalDate);
    public int compareTo(java.time.OffsetTime);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.OffsetTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public int getNano();
    public java.time.ZoneOffset getOffset();
    public int getSecond();
    public int hashCode();
    public boolean isAfter(java.time.OffsetTime);
    public boolean isBefore(java.time.OffsetTime);
    public boolean isEqual(java.time.OffsetTime);
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.OffsetTime minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime minusHours(long);
    public java.time.OffsetTime minusMinutes(long);
    public java.time.OffsetTime minusNanos(long);
    public java.time.OffsetTime minusSeconds(long);
    public static java.time.OffsetTime now();
    public static java.time.OffsetTime now(java.time.ZoneId);
    public static java.time.OffsetTime now(java.time.Clock);
    public static java.time.OffsetTime of(java.time.LocalTime, java.time.ZoneOffset);
    public static java.time.OffsetTime of(int, int, int, int, java.time.ZoneOffset);
    public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.OffsetTime parse(java.lang.CharSequence);
    public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.OffsetTime plusHours(long);
    public java.time.OffsetTime plusMinutes(long);
    public java.time.OffsetTime plusNanos(long);
    public java.time.OffsetTime plusSeconds(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.time.LocalTime toLocalTime();
    public java.lang.String toString();
    public java.time.OffsetTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.OffsetTime with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.OffsetTime withHour(int);
    public java.time.OffsetTime withMinute(int);
    public java.time.OffsetTime withNano(int);
    public java.time.OffsetTime withOffsetSameInstant(java.time.ZoneOffset);
    public java.time.OffsetTime withOffsetSameLocal(java.time.ZoneOffset);
    public java.time.OffsetTime withSecond(int);


    public static java.time.OffsetTime MAX;
    public static java.time.OffsetTime MIN;
}

-keep class java.time.Period {

    public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public static java.time.Period between(java.time.LocalDate, java.time.LocalDate);
    public boolean equals(java.lang.Object);
    public static java.time.Period from(java.time.temporal.TemporalAmount);
    public long get(java.time.temporal.TemporalUnit);
    public java.time.chrono.IsoChronology getChronology();
    public java.time.chrono.Chronology getChronology();
    public int getDays();
    public int getMonths();
    public java.util.List getUnits();
    public int getYears();
    public int hashCode();
    public boolean isNegative();
    public boolean isZero();
    public java.time.Period minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
    public java.time.Period minusDays(long);
    public java.time.Period minusMonths(long);
    public java.time.Period minusYears(long);
    public java.time.Period multipliedBy(int);
    public java.time.chrono.ChronoPeriod multipliedBy(int);
    public java.time.Period negated();
    public java.time.chrono.ChronoPeriod negated();
    public java.time.Period normalized();
    public java.time.chrono.ChronoPeriod normalized();
    public static java.time.Period of(int, int, int);
    public static java.time.Period ofDays(int);
    public static java.time.Period ofMonths(int);
    public static java.time.Period ofWeeks(int);
    public static java.time.Period ofYears(int);
    public static java.time.Period parse(java.lang.CharSequence);
    public java.time.Period plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
    public java.time.Period plusDays(long);
    public java.time.Period plusMonths(long);
    public java.time.Period plusYears(long);
    public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
    public java.lang.String toString();
    public long toTotalMonths();
    public java.time.Period withDays(int);
    public java.time.Period withMonths(int);
    public java.time.Period withYears(int);


    public static java.time.Period ZERO;
}

-keep class java.time.ZoneId {

    public boolean equals(java.lang.Object);
    public static java.time.ZoneId from(java.time.temporal.TemporalAccessor);
    public static java.util.Set getAvailableZoneIds();
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public abstract java.lang.String getId();
    public abstract java.time.zone.ZoneRules getRules();
    public int hashCode();
    public java.time.ZoneId normalized();
    public static java.time.ZoneId of(java.lang.String, java.util.Map);
    public static java.time.ZoneId of(java.lang.String);
    public static java.time.ZoneId ofOffset(java.lang.String, java.time.ZoneOffset);
    public static java.time.ZoneId systemDefault();
    public java.lang.String toString();


    public static java.util.Map SHORT_IDS;
}

-keep class java.time.ZoneOffset {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public int compareTo(java.time.ZoneOffset);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getId();
    public long getLong(java.time.temporal.TemporalField);
    public java.time.zone.ZoneRules getRules();
    public int getTotalSeconds();
    public int hashCode();
    public boolean isSupported(java.time.temporal.TemporalField);
    public static java.time.ZoneOffset of(java.lang.String);
    public static java.time.ZoneOffset ofHours(int);
    public static java.time.ZoneOffset ofHoursMinutes(int, int);
    public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
    public static java.time.ZoneOffset ofTotalSeconds(int);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.lang.String toString();


    public static java.time.ZoneOffset MAX;
    public static java.time.ZoneOffset MIN;
    public static java.time.ZoneOffset UTC;
}

-keep class java.time.ZonedDateTime {

    public boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.ZonedDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public int getDayOfMonth();
    public java.time.DayOfWeek getDayOfWeek();
    public int getDayOfYear();
    public int getHour();
    public long getLong(java.time.temporal.TemporalField);
    public int getMinute();
    public java.time.Month getMonth();
    public int getMonthValue();
    public int getNano();
    public java.time.ZoneOffset getOffset();
    public int getSecond();
    public int getYear();
    public java.time.ZoneId getZone();
    public int hashCode();
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.ZonedDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoZonedDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime minusDays(long);
    public java.time.ZonedDateTime minusHours(long);
    public java.time.ZonedDateTime minusMinutes(long);
    public java.time.ZonedDateTime minusMonths(long);
    public java.time.ZonedDateTime minusNanos(long);
    public java.time.ZonedDateTime minusSeconds(long);
    public java.time.ZonedDateTime minusWeeks(long);
    public java.time.ZonedDateTime minusYears(long);
    public static java.time.ZonedDateTime now();
    public static java.time.ZonedDateTime now(java.time.ZoneId);
    public static java.time.ZonedDateTime now(java.time.Clock);
    public static java.time.ZonedDateTime of(java.time.LocalDate, java.time.LocalTime, java.time.ZoneId);
    public static java.time.ZonedDateTime of(java.time.LocalDateTime, java.time.ZoneId);
    public static java.time.ZonedDateTime of(int, int, int, int, int, int, int, java.time.ZoneId);
    public static java.time.ZonedDateTime ofInstant(java.time.Instant, java.time.ZoneId);
    public static java.time.ZonedDateTime ofInstant(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
    public static java.time.ZonedDateTime ofLocal(java.time.LocalDateTime, java.time.ZoneId, java.time.ZoneOffset);
    public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
    public static java.time.ZonedDateTime parse(java.lang.CharSequence);
    public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
    public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoZonedDateTime plus(java.time.temporal.TemporalAmount);
    public java.time.ZonedDateTime plusDays(long);
    public java.time.ZonedDateTime plusHours(long);
    public java.time.ZonedDateTime plusMinutes(long);
    public java.time.ZonedDateTime plusMonths(long);
    public java.time.ZonedDateTime plusNanos(long);
    public java.time.ZonedDateTime plusSeconds(long);
    public java.time.ZonedDateTime plusWeeks(long);
    public java.time.ZonedDateTime plusYears(long);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public java.time.LocalDate toLocalDate();
    public java.time.chrono.ChronoLocalDate toLocalDate();
    public java.time.LocalDateTime toLocalDateTime();
    public java.time.chrono.ChronoLocalDateTime toLocalDateTime();
    public java.time.LocalTime toLocalTime();
    public java.time.OffsetDateTime toOffsetDateTime();
    public java.lang.String toString();
    public java.time.ZonedDateTime truncatedTo(java.time.temporal.TemporalUnit);
    public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.ZonedDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.ZonedDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalField, long);
    public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalAdjuster);
    public java.time.ZonedDateTime withDayOfMonth(int);
    public java.time.ZonedDateTime withDayOfYear(int);
    public java.time.ZonedDateTime withEarlierOffsetAtOverlap();
    public java.time.chrono.ChronoZonedDateTime withEarlierOffsetAtOverlap();
    public java.time.ZonedDateTime withFixedOffsetZone();
    public java.time.ZonedDateTime withHour(int);
    public java.time.ZonedDateTime withLaterOffsetAtOverlap();
    public java.time.chrono.ChronoZonedDateTime withLaterOffsetAtOverlap();
    public java.time.ZonedDateTime withMinute(int);
    public java.time.ZonedDateTime withMonth(int);
    public java.time.ZonedDateTime withNano(int);
    public java.time.ZonedDateTime withSecond(int);
    public java.time.ZonedDateTime withYear(int);
    public java.time.ZonedDateTime withZoneSameInstant(java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime withZoneSameInstant(java.time.ZoneId);
    public java.time.ZonedDateTime withZoneSameLocal(java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime withZoneSameLocal(java.time.ZoneId);


}

-keep class java.time.chrono.AbstractChronology {
    <init>();

    public int compareTo(java.time.chrono.Chronology);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public java.lang.String toString();


}

-keep class java.time.chrono.ChronoLocalDate {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public java.time.chrono.ChronoLocalDateTime atTime(java.time.LocalTime);
    public int compareTo(java.time.chrono.ChronoLocalDate);
    public int compareTo(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.chrono.ChronoLocalDate from(java.time.temporal.TemporalAccessor);
    public abstract java.time.chrono.Chronology getChronology();
    public java.time.chrono.Era getEra();
    public abstract int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDate);
    public boolean isBefore(java.time.chrono.ChronoLocalDate);
    public boolean isEqual(java.time.chrono.ChronoLocalDate);
    public boolean isLeapYear();
    public boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public abstract int lengthOfMonth();
    public int lengthOfYear();
    public java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public static java.util.Comparator timeLineOrder();
    public long toEpochDay();
    public abstract java.lang.String toString();
    public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
    public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);


}

-keep class java.time.chrono.ChronoLocalDateTime {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public abstract java.time.chrono.ChronoZonedDateTime atZone(java.time.ZoneId);
    public int compareTo(java.time.chrono.ChronoLocalDateTime);
    public int compareTo(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.chrono.ChronoLocalDateTime from(java.time.temporal.TemporalAccessor);
    public java.time.chrono.Chronology getChronology();
    public abstract int hashCode();
    public boolean isAfter(java.time.chrono.ChronoLocalDateTime);
    public boolean isBefore(java.time.chrono.ChronoLocalDateTime);
    public boolean isEqual(java.time.chrono.ChronoLocalDateTime);
    public abstract boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoLocalDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoLocalDateTime plus(java.time.temporal.TemporalAmount);
    public abstract java.time.chrono.ChronoLocalDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public static java.util.Comparator timeLineOrder();
    public long toEpochSecond(java.time.ZoneOffset);
    public java.time.Instant toInstant(java.time.ZoneOffset);
    public abstract java.time.chrono.ChronoLocalDate toLocalDate();
    public abstract java.time.LocalTime toLocalTime();
    public abstract java.lang.String toString();
    public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);


}

-keep class java.time.chrono.ChronoPeriod {

    public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public static java.time.chrono.ChronoPeriod between(java.time.chrono.ChronoLocalDate, java.time.chrono.ChronoLocalDate);
    public abstract boolean equals(java.lang.Object);
    public abstract long get(java.time.temporal.TemporalUnit);
    public abstract java.time.chrono.Chronology getChronology();
    public abstract java.util.List getUnits();
    public abstract int hashCode();
    public boolean isNegative();
    public boolean isZero();
    public abstract java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
    public abstract java.time.chrono.ChronoPeriod multipliedBy(int);
    public java.time.chrono.ChronoPeriod negated();
    public abstract java.time.chrono.ChronoPeriod normalized();
    public abstract java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
    public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
    public abstract java.lang.String toString();


}

-keep class java.time.chrono.ChronoZonedDateTime {

    public int compareTo(java.time.chrono.ChronoZonedDateTime);
    public int compareTo(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public java.lang.String format(java.time.format.DateTimeFormatter);
    public static java.time.chrono.ChronoZonedDateTime from(java.time.temporal.TemporalAccessor);
    public int get(java.time.temporal.TemporalField);
    public java.time.chrono.Chronology getChronology();
    public long getLong(java.time.temporal.TemporalField);
    public abstract java.time.ZoneOffset getOffset();
    public abstract java.time.ZoneId getZone();
    public abstract int hashCode();
    public boolean isAfter(java.time.chrono.ChronoZonedDateTime);
    public boolean isBefore(java.time.chrono.ChronoZonedDateTime);
    public boolean isEqual(java.time.chrono.ChronoZonedDateTime);
    public abstract boolean isSupported(java.time.temporal.TemporalField);
    public boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.chrono.ChronoZonedDateTime minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.chrono.ChronoZonedDateTime plus(java.time.temporal.TemporalAmount);
    public abstract java.time.chrono.ChronoZonedDateTime plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
    public static java.util.Comparator timeLineOrder();
    public long toEpochSecond();
    public java.time.Instant toInstant();
    public java.time.chrono.ChronoLocalDate toLocalDate();
    public abstract java.time.chrono.ChronoLocalDateTime toLocalDateTime();
    public java.time.LocalTime toLocalTime();
    public abstract java.lang.String toString();
    public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.chrono.ChronoZonedDateTime withEarlierOffsetAtOverlap();
    public abstract java.time.chrono.ChronoZonedDateTime withLaterOffsetAtOverlap();
    public abstract java.time.chrono.ChronoZonedDateTime withZoneSameInstant(java.time.ZoneId);
    public abstract java.time.chrono.ChronoZonedDateTime withZoneSameLocal(java.time.ZoneId);


}

-keep class java.time.chrono.Chronology {

    public abstract int compareTo(java.time.chrono.Chronology);
    public int compareTo(java.lang.Object);
    public java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
    public abstract java.time.chrono.ChronoLocalDate date(int, int, int);
    public abstract java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
    public abstract java.time.chrono.ChronoLocalDate dateEpochDay(long);
    public java.time.chrono.ChronoLocalDate dateNow();
    public java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
    public java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
    public java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
    public abstract java.time.chrono.ChronoLocalDate dateYearDay(int, int);
    public abstract boolean equals(java.lang.Object);
    public abstract java.time.chrono.Era eraOf(int);
    public abstract java.util.List eras();
    public static java.time.chrono.Chronology from(java.time.temporal.TemporalAccessor);
    public static java.util.Set getAvailableChronologies();
    public abstract java.lang.String getCalendarType();
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public abstract java.lang.String getId();
    public abstract int hashCode();
    public abstract boolean isLeapYear(long);
    public java.time.chrono.ChronoLocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
    public static java.time.chrono.Chronology of(java.lang.String);
    public static java.time.chrono.Chronology ofLocale(java.util.Locale);
    public java.time.chrono.ChronoPeriod period(int, int, int);
    public abstract int prolepticYear(java.time.chrono.Era, int);
    public abstract java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
    public abstract java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public abstract java.lang.String toString();
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);


}

-keep class java.time.chrono.Era {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
    public int get(java.time.temporal.TemporalField);
    public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
    public long getLong(java.time.temporal.TemporalField);
    public abstract int getValue();
    public boolean isSupported(java.time.temporal.TemporalField);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);


}

-keep class java.time.chrono.IsoChronology {

    public java.time.LocalDate date(java.time.chrono.Era, int, int, int);
    public java.time.LocalDate date(int, int, int);
    public java.time.LocalDate date(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoLocalDate date(int, int, int);
    public java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
    public java.time.LocalDate dateEpochDay(long);
    public java.time.chrono.ChronoLocalDate dateEpochDay(long);
    public java.time.LocalDate dateNow();
    public java.time.LocalDate dateNow(java.time.ZoneId);
    public java.time.LocalDate dateNow(java.time.Clock);
    public java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
    public java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
    public java.time.chrono.ChronoLocalDate dateNow();
    public java.time.LocalDate dateYearDay(java.time.chrono.Era, int, int);
    public java.time.LocalDate dateYearDay(int, int);
    public java.time.chrono.ChronoLocalDate dateYearDay(int, int);
    public java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
    public java.time.chrono.IsoEra eraOf(int);
    public java.time.chrono.Era eraOf(int);
    public java.util.List eras();
    public java.lang.String getCalendarType();
    public java.lang.String getId();
    public boolean isLeapYear(long);
    public java.time.LocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
    public java.time.chrono.ChronoLocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
    public java.time.Period period(int, int, int);
    public java.time.chrono.ChronoPeriod period(int, int, int);
    public int prolepticYear(java.time.chrono.Era, int);
    public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
    public java.time.LocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
    public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
    public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
    public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);


    public static java.time.chrono.IsoChronology INSTANCE;
}

-keep class java.time.chrono.IsoEra {

    public int getValue();
    public static java.time.chrono.IsoEra of(int);
    public static java.time.chrono.IsoEra valueOf(java.lang.String);
    public static java.time.chrono.IsoEra[] values();

    public static java.time.chrono.IsoEra BCE;
    public static java.time.chrono.IsoEra CE;

}

-keep class java.time.format.DateTimeFormatter {

    public java.lang.String format(java.time.temporal.TemporalAccessor);
    public void formatTo(java.time.temporal.TemporalAccessor, java.lang.Appendable);
    public java.time.chrono.Chronology getChronology();
    public java.time.format.DecimalStyle getDecimalStyle();
    public java.util.Locale getLocale();
    public java.util.Set getResolverFields();
    public java.time.format.ResolverStyle getResolverStyle();
    public java.time.ZoneId getZone();
    public static java.time.format.DateTimeFormatter ofLocalizedDate(java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle, java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofLocalizedTime(java.time.format.FormatStyle);
    public static java.time.format.DateTimeFormatter ofPattern(java.lang.String);
    public static java.time.format.DateTimeFormatter ofPattern(java.lang.String, java.util.Locale);
    public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence);
    public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence, java.text.ParsePosition);
    public java.lang.Object parse(java.lang.CharSequence, java.time.temporal.TemporalQuery);
    public java.time.temporal.TemporalAccessor parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery[]);
    public java.time.temporal.TemporalAccessor parseUnresolved(java.lang.CharSequence, java.text.ParsePosition);
    public static java.time.temporal.TemporalQuery parsedExcessDays();
    public static java.time.temporal.TemporalQuery parsedLeapSecond();
    public java.text.Format toFormat();
    public java.text.Format toFormat(java.time.temporal.TemporalQuery);
    public java.lang.String toString();
    public java.time.format.DateTimeFormatter withChronology(java.time.chrono.Chronology);
    public java.time.format.DateTimeFormatter withDecimalStyle(java.time.format.DecimalStyle);
    public java.time.format.DateTimeFormatter withLocale(java.util.Locale);
    public java.time.format.DateTimeFormatter withResolverFields(java.time.temporal.TemporalField[]);
    public java.time.format.DateTimeFormatter withResolverFields(java.util.Set);
    public java.time.format.DateTimeFormatter withResolverStyle(java.time.format.ResolverStyle);
    public java.time.format.DateTimeFormatter withZone(java.time.ZoneId);


    public static java.time.format.DateTimeFormatter BASIC_ISO_DATE;
    public static java.time.format.DateTimeFormatter ISO_DATE;
    public static java.time.format.DateTimeFormatter ISO_DATE_TIME;
    public static java.time.format.DateTimeFormatter ISO_INSTANT;
    public static java.time.format.DateTimeFormatter ISO_LOCAL_DATE;
    public static java.time.format.DateTimeFormatter ISO_LOCAL_DATE_TIME;
    public static java.time.format.DateTimeFormatter ISO_LOCAL_TIME;
    public static java.time.format.DateTimeFormatter ISO_OFFSET_DATE;
    public static java.time.format.DateTimeFormatter ISO_OFFSET_DATE_TIME;
    public static java.time.format.DateTimeFormatter ISO_OFFSET_TIME;
    public static java.time.format.DateTimeFormatter ISO_ORDINAL_DATE;
    public static java.time.format.DateTimeFormatter ISO_TIME;
    public static java.time.format.DateTimeFormatter ISO_WEEK_DATE;
    public static java.time.format.DateTimeFormatter ISO_ZONED_DATE_TIME;
    public static java.time.format.DateTimeFormatter RFC_1123_DATE_TIME;
}

-keep class java.time.format.DecimalStyle {

    public boolean equals(java.lang.Object);
    public static java.util.Set getAvailableLocales();
    public char getDecimalSeparator();
    public char getNegativeSign();
    public char getPositiveSign();
    public char getZeroDigit();
    public int hashCode();
    public static java.time.format.DecimalStyle of(java.util.Locale);
    public static java.time.format.DecimalStyle ofDefaultLocale();
    public java.lang.String toString();
    public java.time.format.DecimalStyle withDecimalSeparator(char);
    public java.time.format.DecimalStyle withNegativeSign(char);
    public java.time.format.DecimalStyle withPositiveSign(char);
    public java.time.format.DecimalStyle withZeroDigit(char);


    public static java.time.format.DecimalStyle STANDARD;
}

-keep class java.time.format.FormatStyle {

    public static java.time.format.FormatStyle valueOf(java.lang.String);
    public static java.time.format.FormatStyle[] values();

    public static java.time.format.FormatStyle FULL;
    public static java.time.format.FormatStyle LONG;
    public static java.time.format.FormatStyle MEDIUM;
    public static java.time.format.FormatStyle SHORT;

}

-keep class java.time.format.ResolverStyle {

    public static java.time.format.ResolverStyle valueOf(java.lang.String);
    public static java.time.format.ResolverStyle[] values();

    public static java.time.format.ResolverStyle LENIENT;
    public static java.time.format.ResolverStyle SMART;
    public static java.time.format.ResolverStyle STRICT;

}

-keep class java.time.format.TextStyle {

    public java.time.format.TextStyle asNormal();
    public java.time.format.TextStyle asStandalone();
    public boolean isStandalone();
    public static java.time.format.TextStyle valueOf(java.lang.String);
    public static java.time.format.TextStyle[] values();

    public static java.time.format.TextStyle FULL;
    public static java.time.format.TextStyle FULL_STANDALONE;
    public static java.time.format.TextStyle NARROW;
    public static java.time.format.TextStyle NARROW_STANDALONE;
    public static java.time.format.TextStyle SHORT;
    public static java.time.format.TextStyle SHORT_STANDALONE;

}

-keep class java.time.temporal.ChronoField {

    public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal, long);
    public int checkValidIntValue(long);
    public long checkValidValue(long);
    public java.time.temporal.TemporalUnit getBaseUnit();
    public java.lang.String getDisplayName(java.util.Locale);
    public long getFrom(java.time.temporal.TemporalAccessor);
    public java.time.temporal.TemporalUnit getRangeUnit();
    public boolean isDateBased();
    public boolean isSupportedBy(java.time.temporal.TemporalAccessor);
    public boolean isTimeBased();
    public java.time.temporal.ValueRange range();
    public java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
    public java.lang.String toString();
    public static java.time.temporal.ChronoField valueOf(java.lang.String);
    public static java.time.temporal.ChronoField[] values();

    public static java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_MONTH;
    public static java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_YEAR;
    public static java.time.temporal.ChronoField ALIGNED_WEEK_OF_MONTH;
    public static java.time.temporal.ChronoField ALIGNED_WEEK_OF_YEAR;
    public static java.time.temporal.ChronoField AMPM_OF_DAY;
    public static java.time.temporal.ChronoField CLOCK_HOUR_OF_AMPM;
    public static java.time.temporal.ChronoField CLOCK_HOUR_OF_DAY;
    public static java.time.temporal.ChronoField DAY_OF_MONTH;
    public static java.time.temporal.ChronoField DAY_OF_WEEK;
    public static java.time.temporal.ChronoField DAY_OF_YEAR;
    public static java.time.temporal.ChronoField EPOCH_DAY;
    public static java.time.temporal.ChronoField ERA;
    public static java.time.temporal.ChronoField HOUR_OF_AMPM;
    public static java.time.temporal.ChronoField HOUR_OF_DAY;
    public static java.time.temporal.ChronoField INSTANT_SECONDS;
    public static java.time.temporal.ChronoField MICRO_OF_DAY;
    public static java.time.temporal.ChronoField MICRO_OF_SECOND;
    public static java.time.temporal.ChronoField MILLI_OF_DAY;
    public static java.time.temporal.ChronoField MILLI_OF_SECOND;
    public static java.time.temporal.ChronoField MINUTE_OF_DAY;
    public static java.time.temporal.ChronoField MINUTE_OF_HOUR;
    public static java.time.temporal.ChronoField MONTH_OF_YEAR;
    public static java.time.temporal.ChronoField NANO_OF_DAY;
    public static java.time.temporal.ChronoField NANO_OF_SECOND;
    public static java.time.temporal.ChronoField OFFSET_SECONDS;
    public static java.time.temporal.ChronoField PROLEPTIC_MONTH;
    public static java.time.temporal.ChronoField SECOND_OF_DAY;
    public static java.time.temporal.ChronoField SECOND_OF_MINUTE;
    public static java.time.temporal.ChronoField YEAR;
    public static java.time.temporal.ChronoField YEAR_OF_ERA;

}

-keep class java.time.temporal.Temporal {

    public abstract boolean isSupported(java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
    public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
    public abstract java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
    public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
    public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
    public abstract java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);


}

-keep class java.time.temporal.TemporalAccessor {

    public int get(java.time.temporal.TemporalField);
    public abstract long getLong(java.time.temporal.TemporalField);
    public abstract boolean isSupported(java.time.temporal.TemporalField);
    public java.lang.Object query(java.time.temporal.TemporalQuery);
    public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);


}

-keep class java.time.temporal.TemporalAdjuster {

    public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);


}

-keep class java.time.temporal.TemporalAmount {

    public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
    public abstract long get(java.time.temporal.TemporalUnit);
    public abstract java.util.List getUnits();
    public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);


}

-keep class java.time.temporal.TemporalField {

    public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal, long);
    public abstract java.time.temporal.TemporalUnit getBaseUnit();
    public java.lang.String getDisplayName(java.util.Locale);
    public abstract long getFrom(java.time.temporal.TemporalAccessor);
    public abstract java.time.temporal.TemporalUnit getRangeUnit();
    public abstract boolean isDateBased();
    public abstract boolean isSupportedBy(java.time.temporal.TemporalAccessor);
    public abstract boolean isTimeBased();
    public abstract java.time.temporal.ValueRange range();
    public abstract java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
    public java.time.temporal.TemporalAccessor resolve(java.util.Map, java.time.temporal.TemporalAccessor, java.time.format.ResolverStyle);
    public abstract java.lang.String toString();


}

-keep class java.time.temporal.TemporalQuery {

    public abstract java.lang.Object queryFrom(java.time.temporal.TemporalAccessor);


}

-keep class java.time.temporal.TemporalUnit {

    public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal, long);
    public abstract long between(java.time.temporal.Temporal, java.time.temporal.Temporal);
    public abstract java.time.Duration getDuration();
    public abstract boolean isDateBased();
    public abstract boolean isDurationEstimated();
    public boolean isSupportedBy(java.time.temporal.Temporal);
    public abstract boolean isTimeBased();
    public abstract java.lang.String toString();


}

-keep class java.time.temporal.ValueRange {

    public int checkValidIntValue(long, java.time.temporal.TemporalField);
    public long checkValidValue(long, java.time.temporal.TemporalField);
    public boolean equals(java.lang.Object);
    public long getLargestMinimum();
    public long getMaximum();
    public long getMinimum();
    public long getSmallestMaximum();
    public int hashCode();
    public boolean isFixed();
    public boolean isIntValue();
    public boolean isValidIntValue(long);
    public boolean isValidValue(long);
    public static java.time.temporal.ValueRange of(long, long);
    public static java.time.temporal.ValueRange of(long, long, long);
    public static java.time.temporal.ValueRange of(long, long, long, long);
    public java.lang.String toString();


}

-keep class java.time.zone.ZoneOffsetTransition {

    public int compareTo(java.time.zone.ZoneOffsetTransition);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public java.time.LocalDateTime getDateTimeAfter();
    public java.time.LocalDateTime getDateTimeBefore();
    public java.time.Duration getDuration();
    public java.time.Instant getInstant();
    public java.time.ZoneOffset getOffsetAfter();
    public java.time.ZoneOffset getOffsetBefore();
    public int hashCode();
    public boolean isGap();
    public boolean isOverlap();
    public boolean isValidOffset(java.time.ZoneOffset);
    public static java.time.zone.ZoneOffsetTransition of(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
    public long toEpochSecond();
    public java.lang.String toString();


}

-keep class java.time.zone.ZoneOffsetTransitionRule {

    public java.time.zone.ZoneOffsetTransition createTransition(int);
    public boolean equals(java.lang.Object);
    public int getDayOfMonthIndicator();
    public java.time.DayOfWeek getDayOfWeek();
    public java.time.LocalTime getLocalTime();
    public java.time.Month getMonth();
    public java.time.ZoneOffset getOffsetAfter();
    public java.time.ZoneOffset getOffsetBefore();
    public java.time.ZoneOffset getStandardOffset();
    public java.time.zone.ZoneOffsetTransitionRule$TimeDefinition getTimeDefinition();
    public int hashCode();
    public boolean isMidnightEndOfDay();
    public static java.time.zone.ZoneOffsetTransitionRule of(java.time.Month, int, java.time.DayOfWeek, java.time.LocalTime, boolean, java.time.zone.ZoneOffsetTransitionRule$TimeDefinition, java.time.ZoneOffset, java.time.ZoneOffset, java.time.ZoneOffset);
    public java.lang.String toString();


}

-keep class java.time.zone.ZoneOffsetTransitionRule$TimeDefinition {

    public java.time.LocalDateTime createDateTime(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition valueOf(java.lang.String);
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition[] values();

    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition STANDARD;
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition UTC;
    public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition WALL;

}

-keep class java.time.zone.ZoneRules {

    public boolean equals(java.lang.Object);
    public java.time.Duration getDaylightSavings(java.time.Instant);
    public java.time.ZoneOffset getOffset(java.time.Instant);
    public java.time.ZoneOffset getOffset(java.time.LocalDateTime);
    public java.time.ZoneOffset getStandardOffset(java.time.Instant);
    public java.time.zone.ZoneOffsetTransition getTransition(java.time.LocalDateTime);
    public java.util.List getTransitionRules();
    public java.util.List getTransitions();
    public java.util.List getValidOffsets(java.time.LocalDateTime);
    public int hashCode();
    public boolean isDaylightSavings(java.time.Instant);
    public boolean isFixedOffset();
    public boolean isValidOffset(java.time.LocalDateTime, java.time.ZoneOffset);
    public java.time.zone.ZoneOffsetTransition nextTransition(java.time.Instant);
    public static java.time.zone.ZoneRules of(java.time.ZoneOffset, java.time.ZoneOffset, java.util.List, java.util.List, java.util.List);
    public static java.time.zone.ZoneRules of(java.time.ZoneOffset);
    public java.time.zone.ZoneOffsetTransition previousTransition(java.time.Instant);
    public java.lang.String toString();


}

-keep class java.util.AbstractCollection {
    <init>();

    public boolean add(java.lang.Object);
    public boolean addAll(java.util.Collection);
    public void clear();
    public boolean contains(java.lang.Object);
    public boolean containsAll(java.util.Collection);
    public boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public boolean remove(java.lang.Object);
    public boolean removeAll(java.util.Collection);
    public boolean retainAll(java.util.Collection);
    public abstract int size();
    public java.lang.Object[] toArray();
    public java.lang.Object[] toArray(java.lang.Object[]);
    public java.lang.String toString();


}

-keep class java.util.AbstractList {
    <init>();

    public boolean add(java.lang.Object);
    public void add(int, java.lang.Object);
    public boolean addAll(int, java.util.Collection);
    public void clear();
    public boolean equals(java.lang.Object);
    public abstract java.lang.Object get(int);
    public int hashCode();
    public int indexOf(java.lang.Object);
    public java.util.Iterator iterator();
    public int lastIndexOf(java.lang.Object);
    public java.util.ListIterator listIterator();
    public java.util.ListIterator listIterator(int);
    public java.lang.Object remove(int);
    protected void removeRange(int, int);
    public java.lang.Object set(int, java.lang.Object);
    public java.util.List subList(int, int);


    protected transient int modCount;
}

-keep class java.util.AbstractMap {
    <init>();

    public void clear();
    protected java.lang.Object clone();
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public abstract java.util.Set entrySet();
    public boolean equals(java.lang.Object);
    public java.lang.Object get(java.lang.Object);
    public int hashCode();
    public boolean isEmpty();
    public java.util.Set keySet();
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(java.util.Map);
    public java.lang.Object remove(java.lang.Object);
    public int size();
    public java.lang.String toString();
    public java.util.Collection values();


}

-keep class java.util.ArrayList {
    <init>(int);
    <init>();
    <init>(java.util.Collection);

    public boolean add(java.lang.Object);
    public void add(int, java.lang.Object);
    public boolean addAll(java.util.Collection);
    public boolean addAll(int, java.util.Collection);
    public void clear();
    public java.lang.Object clone();
    public boolean contains(java.lang.Object);
    public void ensureCapacity(int);
    public void forEach(java.util.function.Consumer);
    public java.lang.Object get(int);
    public int indexOf(java.lang.Object);
    public boolean isEmpty();
    public java.util.Iterator iterator();
    public int lastIndexOf(java.lang.Object);
    public java.util.ListIterator listIterator(int);
    public java.util.ListIterator listIterator();
    public java.lang.Object remove(int);
    public boolean remove(java.lang.Object);
    public boolean removeAll(java.util.Collection);
    public boolean removeIf(java.util.function.Predicate);
    protected void removeRange(int, int);
    public void replaceAll(java.util.function.UnaryOperator);
    public boolean retainAll(java.util.Collection);
    public java.lang.Object set(int, java.lang.Object);
    public int size();
    public void sort(java.util.Comparator);
    public java.util.Spliterator spliterator();
    public java.util.List subList(int, int);
    public java.lang.Object[] toArray();
    public java.lang.Object[] toArray(java.lang.Object[]);
    public void trimToSize();


}

-keep class java.util.Collection {

    public abstract boolean add(java.lang.Object);
    public abstract boolean addAll(java.util.Collection);
    public abstract void clear();
    public abstract boolean contains(java.lang.Object);
    public abstract boolean containsAll(java.util.Collection);
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public java.util.stream.Stream parallelStream();
    public abstract boolean remove(java.lang.Object);
    public abstract boolean removeAll(java.util.Collection);
    public boolean removeIf(java.util.function.Predicate);
    public abstract boolean retainAll(java.util.Collection);
    public abstract int size();
    public java.util.Spliterator spliterator();
    public java.util.stream.Stream stream();
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.lang.Object[]);


}

-keep class java.util.Comparator {

    public abstract int compare(java.lang.Object, java.lang.Object);
    public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator);
    public static java.util.Comparator comparing(java.util.function.Function);
    public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction);
    public static java.util.Comparator comparingInt(java.util.function.ToIntFunction);
    public static java.util.Comparator comparingLong(java.util.function.ToLongFunction);
    public abstract boolean equals(java.lang.Object);
    public static java.util.Comparator naturalOrder();
    public static java.util.Comparator nullsFirst(java.util.Comparator);
    public static java.util.Comparator nullsLast(java.util.Comparator);
    public static java.util.Comparator reverseOrder();
    public java.util.Comparator reversed();
    public java.util.Comparator thenComparing(java.util.Comparator);
    public java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator);
    public java.util.Comparator thenComparing(java.util.function.Function);
    public java.util.Comparator thenComparingDouble(java.util.function.ToDoubleFunction);
    public java.util.Comparator thenComparingInt(java.util.function.ToIntFunction);
    public java.util.Comparator thenComparingLong(java.util.function.ToLongFunction);


}

-keep class java.util.Date {
    <init>();
    <init>(long);
    <init>(int, int, int);
    <init>(int, int, int, int, int);
    <init>(int, int, int, int, int, int);
    <init>(java.lang.String);

    public static long UTC(int, int, int, int, int, int);
    public boolean after(java.util.Date);
    public boolean before(java.util.Date);
    public java.lang.Object clone();
    public int compareTo(java.util.Date);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.util.Date from(java.time.Instant);
    public int getDate();
    public int getDay();
    public int getHours();
    public int getMinutes();
    public int getMonth();
    public int getSeconds();
    public long getTime();
    public int getTimezoneOffset();
    public int getYear();
    public int hashCode();
    public static long parse(java.lang.String);
    public void setDate(int);
    public void setHours(int);
    public void setMinutes(int);
    public void setMonth(int);
    public void setSeconds(int);
    public void setTime(long);
    public void setYear(int);
    public java.lang.String toGMTString();
    public java.time.Instant toInstant();
    public java.lang.String toLocaleString();
    public java.lang.String toString();


}

-keep class java.util.Dictionary {
    <init>();

    public abstract java.util.Enumeration elements();
    public abstract java.lang.Object get(java.lang.Object);
    public abstract boolean isEmpty();
    public abstract java.util.Enumeration keys();
    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
    public abstract java.lang.Object remove(java.lang.Object);
    public abstract int size();


}

-keep class java.util.DoubleSummaryStatistics {
    <init>();

    public void accept(double);
    public void combine(java.util.DoubleSummaryStatistics);
    public double getAverage();
    public long getCount();
    public double getMax();
    public double getMin();
    public double getSum();
    public java.lang.String toString();


}

-keep class java.util.Enumeration {

    public abstract boolean hasMoreElements();
    public abstract java.lang.Object nextElement();


}

-keep class java.util.HashMap {
    <init>(int, float);
    <init>(int);
    <init>();
    <init>(java.util.Map);

    public void clear();
    public java.lang.Object clone();
    public java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public java.util.Set entrySet();
    public void forEach(java.util.function.BiConsumer);
    public java.lang.Object get(java.lang.Object);
    public java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public boolean isEmpty();
    public java.util.Set keySet();
    public java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public java.lang.Object put(java.lang.Object, java.lang.Object);
    public void putAll(java.util.Map);
    public java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    public java.lang.Object remove(java.lang.Object);
    public boolean remove(java.lang.Object, java.lang.Object);
    public boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public java.lang.Object replace(java.lang.Object, java.lang.Object);
    public void replaceAll(java.util.function.BiFunction);
    public int size();
    public java.util.Collection values();


}

-keep class java.util.Hashtable {
    <init>(int, float);
    <init>(int);
    <init>();
    <init>(java.util.Map);

    public synchronized void clear();
    public synchronized java.lang.Object clone();
    public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public synchronized boolean contains(java.lang.Object);
    public synchronized boolean containsKey(java.lang.Object);
    public boolean containsValue(java.lang.Object);
    public synchronized java.util.Enumeration elements();
    public java.util.Set entrySet();
    public synchronized boolean equals(java.lang.Object);
    public synchronized void forEach(java.util.function.BiConsumer);
    public synchronized java.lang.Object get(java.lang.Object);
    public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public synchronized int hashCode();
    public synchronized boolean isEmpty();
    public java.util.Set keySet();
    public synchronized java.util.Enumeration keys();
    public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
    public synchronized void putAll(java.util.Map);
    public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    protected void rehash();
    public synchronized java.lang.Object remove(java.lang.Object);
    public synchronized boolean remove(java.lang.Object, java.lang.Object);
    public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
    public synchronized void replaceAll(java.util.function.BiFunction);
    public synchronized int size();
    public synchronized java.lang.String toString();
    public java.util.Collection values();


}

-keep class java.util.IntSummaryStatistics {
    <init>();

    public void accept(int);
    public void combine(java.util.IntSummaryStatistics);
    public double getAverage();
    public long getCount();
    public int getMax();
    public int getMin();
    public long getSum();
    public java.lang.String toString();


}

-keep class java.util.InvalidPropertiesFormatException {
    <init>(java.lang.Throwable);
    <init>(java.lang.String);



}

-keep class java.util.Iterator {

    public void forEachRemaining(java.util.function.Consumer);
    public abstract boolean hasNext();
    public abstract java.lang.Object next();
    public void remove();


}

-keep class java.util.List {

    public abstract boolean add(java.lang.Object);
    public abstract void add(int, java.lang.Object);
    public abstract boolean addAll(java.util.Collection);
    public abstract boolean addAll(int, java.util.Collection);
    public abstract void clear();
    public abstract boolean contains(java.lang.Object);
    public abstract boolean containsAll(java.util.Collection);
    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.Object get(int);
    public abstract int hashCode();
    public abstract int indexOf(java.lang.Object);
    public abstract boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public abstract int lastIndexOf(java.lang.Object);
    public abstract java.util.ListIterator listIterator();
    public abstract java.util.ListIterator listIterator(int);
    public abstract boolean remove(java.lang.Object);
    public abstract java.lang.Object remove(int);
    public abstract boolean removeAll(java.util.Collection);
    public void replaceAll(java.util.function.UnaryOperator);
    public abstract boolean retainAll(java.util.Collection);
    public abstract java.lang.Object set(int, java.lang.Object);
    public abstract int size();
    public void sort(java.util.Comparator);
    public java.util.Spliterator spliterator();
    public abstract java.util.List subList(int, int);
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.lang.Object[]);


}

-keep class java.util.ListIterator {

    public abstract void add(java.lang.Object);
    public abstract boolean hasNext();
    public abstract boolean hasPrevious();
    public abstract java.lang.Object next();
    public abstract int nextIndex();
    public abstract java.lang.Object previous();
    public abstract int previousIndex();
    public abstract void remove();
    public abstract void set(java.lang.Object);


}

-keep class java.util.Locale {
    <init>(java.lang.String, java.lang.String, java.lang.String);
    <init>(java.lang.String, java.lang.String);
    <init>(java.lang.String);

    public static java.lang.String adjustLanguageCode(java.lang.String);
    public java.lang.Object clone();
    public boolean equals(java.lang.Object);
    public static java.util.List filter(java.util.List, java.util.Collection, java.util.Locale$FilteringMode);
    public static java.util.List filter(java.util.List, java.util.Collection);
    public static java.util.List filterTags(java.util.List, java.util.Collection, java.util.Locale$FilteringMode);
    public static java.util.List filterTags(java.util.List, java.util.Collection);
    public static java.util.Locale forLanguageTag(java.lang.String);
    public static java.util.Locale[] getAvailableLocales();
    public java.lang.String getCountry();
    public static java.util.Locale getDefault();
    public static java.util.Locale getDefault(java.util.Locale$Category);
    public java.lang.String getDisplayCountry();
    public java.lang.String getDisplayCountry(java.util.Locale);
    public java.lang.String getDisplayLanguage();
    public java.lang.String getDisplayLanguage(java.util.Locale);
    public java.lang.String getDisplayName();
    public java.lang.String getDisplayName(java.util.Locale);
    public java.lang.String getDisplayScript();
    public java.lang.String getDisplayScript(java.util.Locale);
    public java.lang.String getDisplayVariant();
    public java.lang.String getDisplayVariant(java.util.Locale);
    public java.lang.String getExtension(char);
    public java.util.Set getExtensionKeys();
    public java.lang.String getISO3Country();
    public java.lang.String getISO3Language();
    public static java.lang.String[] getISOCountries();
    public static java.lang.String[] getISOLanguages();
    public java.lang.String getLanguage();
    public java.lang.String getScript();
    public java.util.Set getUnicodeLocaleAttributes();
    public java.util.Set getUnicodeLocaleKeys();
    public java.lang.String getUnicodeLocaleType(java.lang.String);
    public java.lang.String getVariant();
    public boolean hasExtensions();
    public int hashCode();
    public static java.util.Locale initDefault();
    public static java.util.Locale lookup(java.util.List, java.util.Collection);
    public static java.lang.String lookupTag(java.util.List, java.util.Collection);
    public static synchronized void setDefault(java.util.Locale);
    public static synchronized void setDefault(java.util.Locale$Category, java.util.Locale);
    public java.util.Locale stripExtensions();
    public java.lang.String toLanguageTag();
    public java.lang.String toString();


    public static java.util.Locale CANADA;
    public static java.util.Locale CANADA_FRENCH;
    public static java.util.Locale CHINA;
    public static java.util.Locale CHINESE;
    public static java.util.Locale ENGLISH;
    public static java.util.Locale FRANCE;
    public static java.util.Locale FRENCH;
    public static java.util.Locale GERMAN;
    public static java.util.Locale GERMANY;
    public static java.util.Locale ITALIAN;
    public static java.util.Locale ITALY;
    public static java.util.Locale JAPAN;
    public static java.util.Locale JAPANESE;
    public static java.util.Locale KOREA;
    public static java.util.Locale KOREAN;
    public static java.util.Locale PRC;
    public static char PRIVATE_USE_EXTENSION;
    public static java.util.Locale ROOT;
    public static java.util.Locale SIMPLIFIED_CHINESE;
    public static java.util.Locale TAIWAN;
    public static java.util.Locale TRADITIONAL_CHINESE;
    public static java.util.Locale UK;
    public static char UNICODE_LOCALE_EXTENSION;
    public static java.util.Locale US;
}

-keep class java.util.Locale$Category {

    public static java.util.Locale$Category valueOf(java.lang.String);
    public static java.util.Locale$Category[] values();

    public static java.util.Locale$Category DISPLAY;
    public static java.util.Locale$Category FORMAT;

}

-keep class java.util.Locale$FilteringMode {

    public static java.util.Locale$FilteringMode valueOf(java.lang.String);
    public static java.util.Locale$FilteringMode[] values();

    public static java.util.Locale$FilteringMode AUTOSELECT_FILTERING;
    public static java.util.Locale$FilteringMode EXTENDED_FILTERING;
    public static java.util.Locale$FilteringMode IGNORE_EXTENDED_RANGES;
    public static java.util.Locale$FilteringMode MAP_EXTENDED_RANGES;
    public static java.util.Locale$FilteringMode REJECT_EXTENDED_RANGES;

}

-keep class java.util.Locale$LanguageRange {
    <init>(java.lang.String);
    <init>(java.lang.String, double);

    public boolean equals(java.lang.Object);
    public java.lang.String getRange();
    public double getWeight();
    public int hashCode();
    public static java.util.List mapEquivalents(java.util.List, java.util.Map);
    public static java.util.List parse(java.lang.String);
    public static java.util.List parse(java.lang.String, java.util.Map);


    public static double MAX_WEIGHT;
    public static double MIN_WEIGHT;
}

-keep class java.util.LongSummaryStatistics {
    <init>();

    public void accept(int);
    public void accept(long);
    public void combine(java.util.LongSummaryStatistics);
    public double getAverage();
    public long getCount();
    public long getMax();
    public long getMin();
    public long getSum();
    public java.lang.String toString();


}

-keep class java.util.Map {

    public abstract void clear();
    public java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
    public java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
    public java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
    public abstract boolean containsKey(java.lang.Object);
    public abstract boolean containsValue(java.lang.Object);
    public abstract java.util.Set entrySet();
    public abstract boolean equals(java.lang.Object);
    public void forEach(java.util.function.BiConsumer);
    public abstract java.lang.Object get(java.lang.Object);
    public java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Set keySet();
    public java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
    public abstract void putAll(java.util.Map);
    public java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
    public abstract java.lang.Object remove(java.lang.Object);
    public boolean remove(java.lang.Object, java.lang.Object);
    public boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
    public java.lang.Object replace(java.lang.Object, java.lang.Object);
    public void replaceAll(java.util.function.BiFunction);
    public abstract int size();
    public abstract java.util.Collection values();


}

-keep class java.util.Map$Entry {

    public static java.util.Comparator comparingByKey();
    public static java.util.Comparator comparingByKey(java.util.Comparator);
    public static java.util.Comparator comparingByValue();
    public static java.util.Comparator comparingByValue(java.util.Comparator);
    public abstract boolean equals(java.lang.Object);
    public abstract java.lang.Object getKey();
    public abstract java.lang.Object getValue();
    public abstract int hashCode();
    public abstract java.lang.Object setValue(java.lang.Object);


}

-keep class java.util.MissingResourceException {
    <init>(java.lang.String, java.lang.String, java.lang.String);

    public java.lang.String getClassName();
    public java.lang.String getKey();


}

-keep class java.util.Optional {

    public static java.util.Optional empty();
    public boolean equals(java.lang.Object);
    public java.util.Optional filter(java.util.function.Predicate);
    public java.util.Optional flatMap(java.util.function.Function);
    public java.lang.Object get();
    public int hashCode();
    public void ifPresent(java.util.function.Consumer);
    public boolean isPresent();
    public java.util.Optional map(java.util.function.Function);
    public static java.util.Optional of(java.lang.Object);
    public static java.util.Optional ofNullable(java.lang.Object);
    public java.lang.Object orElse(java.lang.Object);
    public java.lang.Object orElseGet(java.util.function.Supplier);
    public java.lang.Object orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.OptionalDouble {

    public static java.util.OptionalDouble empty();
    public boolean equals(java.lang.Object);
    public double getAsDouble();
    public int hashCode();
    public void ifPresent(java.util.function.DoubleConsumer);
    public boolean isPresent();
    public static java.util.OptionalDouble of(double);
    public double orElse(double);
    public double orElseGet(java.util.function.DoubleSupplier);
    public double orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.OptionalInt {

    public static java.util.OptionalInt empty();
    public boolean equals(java.lang.Object);
    public int getAsInt();
    public int hashCode();
    public void ifPresent(java.util.function.IntConsumer);
    public boolean isPresent();
    public static java.util.OptionalInt of(int);
    public int orElse(int);
    public int orElseGet(java.util.function.IntSupplier);
    public int orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.OptionalLong {

    public static java.util.OptionalLong empty();
    public boolean equals(java.lang.Object);
    public long getAsLong();
    public int hashCode();
    public void ifPresent(java.util.function.LongConsumer);
    public boolean isPresent();
    public static java.util.OptionalLong of(long);
    public long orElse(long);
    public long orElseGet(java.util.function.LongSupplier);
    public long orElseThrow(java.util.function.Supplier);
    public java.lang.String toString();


}

-keep class java.util.PrimitiveIterator {

    public abstract void forEachRemaining(java.lang.Object);


}

-keep class java.util.PrimitiveIterator$OfDouble {

    public void forEachRemaining(java.util.function.DoubleConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public java.lang.Double next();
    public java.lang.Object next();
    public abstract double nextDouble();


}

-keep class java.util.PrimitiveIterator$OfInt {

    public void forEachRemaining(java.util.function.IntConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public java.lang.Integer next();
    public java.lang.Object next();
    public abstract int nextInt();


}

-keep class java.util.PrimitiveIterator$OfLong {

    public void forEachRemaining(java.util.function.LongConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public java.lang.Long next();
    public java.lang.Object next();
    public abstract long nextLong();


}

-keep class java.util.Properties {
    <init>();
    <init>(java.util.Properties);

    public java.lang.String getProperty(java.lang.String);
    public java.lang.String getProperty(java.lang.String, java.lang.String);
    public void list(java.io.PrintStream);
    public void list(java.io.PrintWriter);
    public synchronized void load(java.io.Reader);
    public synchronized void load(java.io.InputStream);
    public synchronized void loadFromXML(java.io.InputStream);
    public java.util.Enumeration propertyNames();
    public void save(java.io.OutputStream, java.lang.String);
    public synchronized java.lang.Object setProperty(java.lang.String, java.lang.String);
    public void store(java.io.Writer, java.lang.String);
    public void store(java.io.OutputStream, java.lang.String);
    public void storeToXML(java.io.OutputStream, java.lang.String);
    public void storeToXML(java.io.OutputStream, java.lang.String, java.lang.String);
    public java.util.Set stringPropertyNames();


    protected java.util.Properties defaults;
}

-keep class java.util.Random {
    <init>();
    <init>(long);

    public java.util.stream.DoubleStream doubles(long);
    public java.util.stream.DoubleStream doubles();
    public java.util.stream.DoubleStream doubles(long, double, double);
    public java.util.stream.DoubleStream doubles(double, double);
    public java.util.stream.IntStream ints(long);
    public java.util.stream.IntStream ints();
    public java.util.stream.IntStream ints(long, int, int);
    public java.util.stream.IntStream ints(int, int);
    public java.util.stream.LongStream longs(long);
    public java.util.stream.LongStream longs();
    public java.util.stream.LongStream longs(long, long, long);
    public java.util.stream.LongStream longs(long, long);
    protected int next(int);
    public boolean nextBoolean();
    public void nextBytes(byte[]);
    public double nextDouble();
    public float nextFloat();
    public synchronized double nextGaussian();
    public int nextInt();
    public int nextInt(int);
    public long nextLong();
    public synchronized void setSeed(long);


}

-keep class java.util.Set {

    public abstract boolean add(java.lang.Object);
    public abstract boolean addAll(java.util.Collection);
    public abstract void clear();
    public abstract boolean contains(java.lang.Object);
    public abstract boolean containsAll(java.util.Collection);
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public abstract boolean isEmpty();
    public abstract java.util.Iterator iterator();
    public abstract boolean remove(java.lang.Object);
    public abstract boolean removeAll(java.util.Collection);
    public abstract boolean retainAll(java.util.Collection);
    public abstract int size();
    public java.util.Spliterator spliterator();
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.lang.Object[]);


}

-keep class java.util.SortedMap {

    public abstract java.util.Comparator comparator();
    public abstract java.util.Set entrySet();
    public abstract java.lang.Object firstKey();
    public abstract java.util.SortedMap headMap(java.lang.Object);
    public abstract java.util.Set keySet();
    public abstract java.lang.Object lastKey();
    public abstract java.util.SortedMap subMap(java.lang.Object, java.lang.Object);
    public abstract java.util.SortedMap tailMap(java.lang.Object);
    public abstract java.util.Collection values();


}

-keep class java.util.Spliterator {

    public abstract int characteristics();
    public abstract long estimateSize();
    public void forEachRemaining(java.util.function.Consumer);
    public java.util.Comparator getComparator();
    public long getExactSizeIfKnown();
    public boolean hasCharacteristics(int);
    public abstract boolean tryAdvance(java.util.function.Consumer);
    public abstract java.util.Spliterator trySplit();


    public static int CONCURRENT;
    public static int DISTINCT;
    public static int IMMUTABLE;
    public static int NONNULL;
    public static int ORDERED;
    public static int SIZED;
    public static int SORTED;
    public static int SUBSIZED;
}

-keep class java.util.Spliterator$OfDouble {

    public void forEachRemaining(java.util.function.DoubleConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.util.function.DoubleConsumer);
    public boolean tryAdvance(java.util.function.Consumer);
    public boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfDouble trySplit();
    public java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.Spliterator$OfInt {

    public void forEachRemaining(java.util.function.IntConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.util.function.IntConsumer);
    public boolean tryAdvance(java.util.function.Consumer);
    public boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfInt trySplit();
    public java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.Spliterator$OfLong {

    public void forEachRemaining(java.util.function.LongConsumer);
    public void forEachRemaining(java.util.function.Consumer);
    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.util.function.LongConsumer);
    public boolean tryAdvance(java.util.function.Consumer);
    public boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfLong trySplit();
    public java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.Spliterator$OfPrimitive {

    public void forEachRemaining(java.lang.Object);
    public abstract boolean tryAdvance(java.lang.Object);
    public abstract java.util.Spliterator$OfPrimitive trySplit();
    public java.util.Spliterator trySplit();


}

-keep class java.util.UUID {
    <init>(long, long);

    public int clockSequence();
    public int compareTo(java.util.UUID);
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public static java.util.UUID fromString(java.lang.String);
    public long getLeastSignificantBits();
    public long getMostSignificantBits();
    public int hashCode();
    public static java.util.UUID nameUUIDFromBytes(byte[]);
    public long node();
    public static java.util.UUID randomUUID();
    public long timestamp();
    public java.lang.String toString();
    public int variant();
    public int version();


}

-keep class java.util.concurrent.Callable {

    public abstract java.lang.Object call();


}

-keep class java.util.concurrent.ExecutionException {
    <init>();
    <init>(java.lang.String);
    <init>(java.lang.String, java.lang.Throwable);
    <init>(java.lang.Throwable);



}

-keep class java.util.concurrent.Executor {

    public abstract void execute(java.lang.Runnable);


}

-keep class java.util.concurrent.ExecutorService {

    public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit);
    public abstract java.util.List invokeAll(java.util.Collection);
    public abstract java.util.List invokeAll(java.util.Collection, long, java.util.concurrent.TimeUnit);
    public abstract java.lang.Object invokeAny(java.util.Collection);
    public abstract java.lang.Object invokeAny(java.util.Collection, long, java.util.concurrent.TimeUnit);
    public abstract boolean isShutdown();
    public abstract boolean isTerminated();
    public abstract void shutdown();
    public abstract java.util.List shutdownNow();
    public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable);
    public abstract java.util.concurrent.Future submit(java.lang.Runnable, java.lang.Object);
    public abstract java.util.concurrent.Future submit(java.lang.Runnable);


}

-keep class java.util.concurrent.Future {

    public abstract boolean cancel(boolean);
    public abstract java.lang.Object get();
    public abstract java.lang.Object get(long, java.util.concurrent.TimeUnit);
    public abstract boolean isCancelled();
    public abstract boolean isDone();


}

-keep class java.util.concurrent.TimeUnit {

    public long convert(long, java.util.concurrent.TimeUnit);
    public void sleep(long);
    public void timedJoin(java.lang.Thread, long);
    public void timedWait(java.lang.Object, long);
    public long toDays(long);
    public long toHours(long);
    public long toMicros(long);
    public long toMillis(long);
    public long toMinutes(long);
    public long toNanos(long);
    public long toSeconds(long);
    public static java.util.concurrent.TimeUnit valueOf(java.lang.String);
    public static java.util.concurrent.TimeUnit[] values();

    public static java.util.concurrent.TimeUnit DAYS;
    public static java.util.concurrent.TimeUnit HOURS;
    public static java.util.concurrent.TimeUnit MICROSECONDS;
    public static java.util.concurrent.TimeUnit MILLISECONDS;
    public static java.util.concurrent.TimeUnit MINUTES;
    public static java.util.concurrent.TimeUnit NANOSECONDS;
    public static java.util.concurrent.TimeUnit SECONDS;

}

-keep class java.util.concurrent.TimeoutException {
    <init>();
    <init>(java.lang.String);



}

-keep class java.util.concurrent.atomic.AtomicInteger {
    <init>(int);
    <init>();

    public int accumulateAndGet(int, java.util.function.IntBinaryOperator);
    public int addAndGet(int);
    public boolean compareAndSet(int, int);
    public int decrementAndGet();
    public double doubleValue();
    public float floatValue();
    public int get();
    public int getAndAccumulate(int, java.util.function.IntBinaryOperator);
    public int getAndAdd(int);
    public int getAndDecrement();
    public int getAndIncrement();
    public int getAndSet(int);
    public int getAndUpdate(java.util.function.IntUnaryOperator);
    public int incrementAndGet();
    public int intValue();
    public void lazySet(int);
    public long longValue();
    public void set(int);
    public java.lang.String toString();
    public int updateAndGet(java.util.function.IntUnaryOperator);
    public boolean weakCompareAndSet(int, int);


}

-keep class java.util.function.BiConsumer {

    public abstract void accept(java.lang.Object, java.lang.Object);
    public java.util.function.BiConsumer andThen(java.util.function.BiConsumer);


}

-keep class java.util.function.BiFunction {

    public java.util.function.BiFunction andThen(java.util.function.Function);
    public abstract java.lang.Object apply(java.lang.Object, java.lang.Object);


}

-keep class java.util.function.BinaryOperator {

    public static java.util.function.BinaryOperator maxBy(java.util.Comparator);
    public static java.util.function.BinaryOperator minBy(java.util.Comparator);


}

-keep class java.util.function.Consumer {

    public abstract void accept(java.lang.Object);
    public java.util.function.Consumer andThen(java.util.function.Consumer);


}

-keep class java.util.function.DoubleBinaryOperator {

    public abstract double applyAsDouble(double, double);


}

-keep class java.util.function.DoubleConsumer {

    public abstract void accept(double);
    public java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);


}

-keep class java.util.function.DoubleFunction {

    public abstract java.lang.Object apply(double);


}

-keep class java.util.function.DoublePredicate {

    public java.util.function.DoublePredicate and(java.util.function.DoublePredicate);
    public java.util.function.DoublePredicate negate();
    public java.util.function.DoublePredicate or(java.util.function.DoublePredicate);
    public abstract boolean test(double);


}

-keep class java.util.function.DoubleSupplier {

    public abstract double getAsDouble();


}

-keep class java.util.function.DoubleToIntFunction {

    public abstract int applyAsInt(double);


}

-keep class java.util.function.DoubleToLongFunction {

    public abstract long applyAsLong(double);


}

-keep class java.util.function.DoubleUnaryOperator {

    public java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator);
    public abstract double applyAsDouble(double);
    public java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator);
    public static java.util.function.DoubleUnaryOperator identity();


}

-keep class java.util.function.Function {

    public java.util.function.Function andThen(java.util.function.Function);
    public abstract java.lang.Object apply(java.lang.Object);
    public java.util.function.Function compose(java.util.function.Function);
    public static java.util.function.Function identity();


}

-keep class java.util.function.IntBinaryOperator {

    public abstract int applyAsInt(int, int);


}

-keep class java.util.function.IntConsumer {

    public abstract void accept(int);
    public java.util.function.IntConsumer andThen(java.util.function.IntConsumer);


}

-keep class java.util.function.IntFunction {

    public abstract java.lang.Object apply(int);


}

-keep class java.util.function.IntPredicate {

    public java.util.function.IntPredicate and(java.util.function.IntPredicate);
    public java.util.function.IntPredicate negate();
    public java.util.function.IntPredicate or(java.util.function.IntPredicate);
    public abstract boolean test(int);


}

-keep class java.util.function.IntSupplier {

    public abstract int getAsInt();


}

-keep class java.util.function.IntToDoubleFunction {

    public abstract double applyAsDouble(int);


}

-keep class java.util.function.IntToLongFunction {

    public abstract long applyAsLong(int);


}

-keep class java.util.function.IntUnaryOperator {

    public java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator);
    public abstract int applyAsInt(int);
    public java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator);
    public static java.util.function.IntUnaryOperator identity();


}

-keep class java.util.function.LongBinaryOperator {

    public abstract long applyAsLong(long, long);


}

-keep class java.util.function.LongConsumer {

    public abstract void accept(long);
    public java.util.function.LongConsumer andThen(java.util.function.LongConsumer);


}

-keep class java.util.function.LongFunction {

    public abstract java.lang.Object apply(long);


}

-keep class java.util.function.LongPredicate {

    public java.util.function.LongPredicate and(java.util.function.LongPredicate);
    public java.util.function.LongPredicate negate();
    public java.util.function.LongPredicate or(java.util.function.LongPredicate);
    public abstract boolean test(long);


}

-keep class java.util.function.LongSupplier {

    public abstract long getAsLong();


}

-keep class java.util.function.LongToDoubleFunction {

    public abstract double applyAsDouble(long);


}

-keep class java.util.function.LongToIntFunction {

    public abstract int applyAsInt(long);


}

-keep class java.util.function.LongUnaryOperator {

    public java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator);
    public abstract long applyAsLong(long);
    public java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator);
    public static java.util.function.LongUnaryOperator identity();


}

-keep class java.util.function.ObjDoubleConsumer {

    public abstract void accept(java.lang.Object, double);


}

-keep class java.util.function.ObjIntConsumer {

    public abstract void accept(java.lang.Object, int);


}

-keep class java.util.function.ObjLongConsumer {

    public abstract void accept(java.lang.Object, long);


}

-keep class java.util.function.Predicate {

    public java.util.function.Predicate and(java.util.function.Predicate);
    public static java.util.function.Predicate isEqual(java.lang.Object);
    public java.util.function.Predicate negate();
    public java.util.function.Predicate or(java.util.function.Predicate);
    public abstract boolean test(java.lang.Object);


}

-keep class java.util.function.Supplier {

    public abstract java.lang.Object get();


}

-keep class java.util.function.ToDoubleFunction {

    public abstract double applyAsDouble(java.lang.Object);


}

-keep class java.util.function.ToIntFunction {

    public abstract int applyAsInt(java.lang.Object);


}

-keep class java.util.function.ToLongFunction {

    public abstract long applyAsLong(java.lang.Object);


}

-keep class java.util.function.UnaryOperator {

    public static java.util.function.UnaryOperator identity();


}

-keep class java.util.stream.BaseStream {

    public abstract void close();
    public abstract boolean isParallel();
    public abstract java.util.Iterator iterator();
    public abstract java.util.stream.BaseStream onClose(java.lang.Runnable);
    public abstract java.util.stream.BaseStream parallel();
    public abstract java.util.stream.BaseStream sequential();
    public abstract java.util.Spliterator spliterator();
    public abstract java.util.stream.BaseStream unordered();


}

-keep class java.util.stream.Collector {

    public abstract java.util.function.BiConsumer accumulator();
    public abstract java.util.Set characteristics();
    public abstract java.util.function.BinaryOperator combiner();
    public abstract java.util.function.Function finisher();
    public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector$Characteristics[]);
    public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector$Characteristics[]);
    public abstract java.util.function.Supplier supplier();


}

-keep class java.util.stream.Collector$Characteristics {

    public static java.util.stream.Collector$Characteristics valueOf(java.lang.String);
    public static java.util.stream.Collector$Characteristics[] values();

    public static java.util.stream.Collector$Characteristics CONCURRENT;
    public static java.util.stream.Collector$Characteristics IDENTITY_FINISH;
    public static java.util.stream.Collector$Characteristics UNORDERED;

}

-keep class java.util.stream.DoubleStream {

    public abstract boolean allMatch(java.util.function.DoublePredicate);
    public abstract boolean anyMatch(java.util.function.DoublePredicate);
    public abstract java.util.OptionalDouble average();
    public abstract java.util.stream.Stream boxed();
    public static java.util.stream.DoubleStream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer);
    public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
    public abstract long count();
    public abstract java.util.stream.DoubleStream distinct();
    public static java.util.stream.DoubleStream empty();
    public abstract java.util.stream.DoubleStream filter(java.util.function.DoublePredicate);
    public abstract java.util.OptionalDouble findAny();
    public abstract java.util.OptionalDouble findFirst();
    public abstract java.util.stream.DoubleStream flatMap(java.util.function.DoubleFunction);
    public abstract void forEach(java.util.function.DoubleConsumer);
    public abstract void forEachOrdered(java.util.function.DoubleConsumer);
    public static java.util.stream.DoubleStream generate(java.util.function.DoubleSupplier);
    public static java.util.stream.DoubleStream iterate(double, java.util.function.DoubleUnaryOperator);
    public abstract java.util.PrimitiveIterator$OfDouble iterator();
    public java.util.Iterator iterator();
    public abstract java.util.stream.DoubleStream limit(long);
    public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
    public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
    public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
    public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction);
    public abstract java.util.OptionalDouble max();
    public abstract java.util.OptionalDouble min();
    public abstract boolean noneMatch(java.util.function.DoublePredicate);
    public static java.util.stream.DoubleStream of(double);
    public static java.util.stream.DoubleStream of(double[]);
    public abstract java.util.stream.DoubleStream parallel();
    public java.util.stream.BaseStream parallel();
    public abstract java.util.stream.DoubleStream peek(java.util.function.DoubleConsumer);
    public abstract double reduce(double, java.util.function.DoubleBinaryOperator);
    public abstract java.util.OptionalDouble reduce(java.util.function.DoubleBinaryOperator);
    public abstract java.util.stream.DoubleStream sequential();
    public java.util.stream.BaseStream sequential();
    public abstract java.util.stream.DoubleStream skip(long);
    public abstract java.util.stream.DoubleStream sorted();
    public abstract java.util.Spliterator$OfDouble spliterator();
    public java.util.Spliterator spliterator();
    public abstract double sum();
    public abstract java.util.DoubleSummaryStatistics summaryStatistics();
    public abstract double[] toArray();


}

-keep class java.util.stream.DoubleStream$Builder {

    public abstract void accept(double);
    public java.util.stream.DoubleStream$Builder add(double);
    public abstract java.util.stream.DoubleStream build();


}

-keep class java.util.stream.IntStream {

    public abstract boolean allMatch(java.util.function.IntPredicate);
    public abstract boolean anyMatch(java.util.function.IntPredicate);
    public abstract java.util.stream.DoubleStream asDoubleStream();
    public abstract java.util.stream.LongStream asLongStream();
    public abstract java.util.OptionalDouble average();
    public abstract java.util.stream.Stream boxed();
    public static java.util.stream.IntStream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer);
    public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
    public abstract long count();
    public abstract java.util.stream.IntStream distinct();
    public static java.util.stream.IntStream empty();
    public abstract java.util.stream.IntStream filter(java.util.function.IntPredicate);
    public abstract java.util.OptionalInt findAny();
    public abstract java.util.OptionalInt findFirst();
    public abstract java.util.stream.IntStream flatMap(java.util.function.IntFunction);
    public abstract void forEach(java.util.function.IntConsumer);
    public abstract void forEachOrdered(java.util.function.IntConsumer);
    public static java.util.stream.IntStream generate(java.util.function.IntSupplier);
    public static java.util.stream.IntStream iterate(int, java.util.function.IntUnaryOperator);
    public abstract java.util.PrimitiveIterator$OfInt iterator();
    public java.util.Iterator iterator();
    public abstract java.util.stream.IntStream limit(long);
    public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
    public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
    public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
    public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction);
    public abstract java.util.OptionalInt max();
    public abstract java.util.OptionalInt min();
    public abstract boolean noneMatch(java.util.function.IntPredicate);
    public static java.util.stream.IntStream of(int);
    public static java.util.stream.IntStream of(int[]);
    public abstract java.util.stream.IntStream parallel();
    public java.util.stream.BaseStream parallel();
    public abstract java.util.stream.IntStream peek(java.util.function.IntConsumer);
    public static java.util.stream.IntStream range(int, int);
    public static java.util.stream.IntStream rangeClosed(int, int);
    public abstract int reduce(int, java.util.function.IntBinaryOperator);
    public abstract java.util.OptionalInt reduce(java.util.function.IntBinaryOperator);
    public abstract java.util.stream.IntStream sequential();
    public java.util.stream.BaseStream sequential();
    public abstract java.util.stream.IntStream skip(long);
    public abstract java.util.stream.IntStream sorted();
    public abstract java.util.Spliterator$OfInt spliterator();
    public java.util.Spliterator spliterator();
    public abstract int sum();
    public abstract java.util.IntSummaryStatistics summaryStatistics();
    public abstract int[] toArray();


}

-keep class java.util.stream.IntStream$Builder {

    public abstract void accept(int);
    public java.util.stream.IntStream$Builder add(int);
    public abstract java.util.stream.IntStream build();


}

-keep class java.util.stream.LongStream {

    public abstract boolean allMatch(java.util.function.LongPredicate);
    public abstract boolean anyMatch(java.util.function.LongPredicate);
    public abstract java.util.stream.DoubleStream asDoubleStream();
    public abstract java.util.OptionalDouble average();
    public abstract java.util.stream.Stream boxed();
    public static java.util.stream.LongStream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer);
    public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
    public abstract long count();
    public abstract java.util.stream.LongStream distinct();
    public static java.util.stream.LongStream empty();
    public abstract java.util.stream.LongStream filter(java.util.function.LongPredicate);
    public abstract java.util.OptionalLong findAny();
    public abstract java.util.OptionalLong findFirst();
    public abstract java.util.stream.LongStream flatMap(java.util.function.LongFunction);
    public abstract void forEach(java.util.function.LongConsumer);
    public abstract void forEachOrdered(java.util.function.LongConsumer);
    public static java.util.stream.LongStream generate(java.util.function.LongSupplier);
    public static java.util.stream.LongStream iterate(long, java.util.function.LongUnaryOperator);
    public abstract java.util.PrimitiveIterator$OfLong iterator();
    public java.util.Iterator iterator();
    public abstract java.util.stream.LongStream limit(long);
    public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
    public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
    public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
    public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction);
    public abstract java.util.OptionalLong max();
    public abstract java.util.OptionalLong min();
    public abstract boolean noneMatch(java.util.function.LongPredicate);
    public static java.util.stream.LongStream of(long);
    public static java.util.stream.LongStream of(long[]);
    public abstract java.util.stream.LongStream parallel();
    public java.util.stream.BaseStream parallel();
    public abstract java.util.stream.LongStream peek(java.util.function.LongConsumer);
    public static java.util.stream.LongStream range(long, long);
    public static java.util.stream.LongStream rangeClosed(long, long);
    public abstract long reduce(long, java.util.function.LongBinaryOperator);
    public abstract java.util.OptionalLong reduce(java.util.function.LongBinaryOperator);
    public abstract java.util.stream.LongStream sequential();
    public java.util.stream.BaseStream sequential();
    public abstract java.util.stream.LongStream skip(long);
    public abstract java.util.stream.LongStream sorted();
    public abstract java.util.Spliterator$OfLong spliterator();
    public java.util.Spliterator spliterator();
    public abstract long sum();
    public abstract java.util.LongSummaryStatistics summaryStatistics();
    public abstract long[] toArray();


}

-keep class java.util.stream.LongStream$Builder {

    public abstract void accept(long);
    public java.util.stream.LongStream$Builder add(long);
    public abstract java.util.stream.LongStream build();


}

-keep class java.util.stream.Stream {

    public abstract boolean allMatch(java.util.function.Predicate);
    public abstract boolean anyMatch(java.util.function.Predicate);
    public static java.util.stream.Stream$Builder builder();
    public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer);
    public abstract java.lang.Object collect(java.util.stream.Collector);
    public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream);
    public abstract long count();
    public abstract java.util.stream.Stream distinct();
    public static java.util.stream.Stream empty();
    public abstract java.util.stream.Stream filter(java.util.function.Predicate);
    public abstract java.util.Optional findAny();
    public abstract java.util.Optional findFirst();
    public abstract java.util.stream.Stream flatMap(java.util.function.Function);
    public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function);
    public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function);
    public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function);
    public abstract void forEach(java.util.function.Consumer);
    public abstract void forEachOrdered(java.util.function.Consumer);
    public static java.util.stream.Stream generate(java.util.function.Supplier);
    public static java.util.stream.Stream iterate(java.lang.Object, java.util.function.UnaryOperator);
    public abstract java.util.stream.Stream limit(long);
    public abstract java.util.stream.Stream map(java.util.function.Function);
    public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction);
    public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction);
    public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction);
    public abstract java.util.Optional max(java.util.Comparator);
    public abstract java.util.Optional min(java.util.Comparator);
    public abstract boolean noneMatch(java.util.function.Predicate);
    public static java.util.stream.Stream of(java.lang.Object);
    public static java.util.stream.Stream of(java.lang.Object[]);
    public abstract java.util.stream.Stream peek(java.util.function.Consumer);
    public abstract java.lang.Object reduce(java.lang.Object, java.util.function.BinaryOperator);
    public abstract java.util.Optional reduce(java.util.function.BinaryOperator);
    public abstract java.lang.Object reduce(java.lang.Object, java.util.function.BiFunction, java.util.function.BinaryOperator);
    public abstract java.util.stream.Stream skip(long);
    public abstract java.util.stream.Stream sorted();
    public abstract java.util.stream.Stream sorted(java.util.Comparator);
    public abstract java.lang.Object[] toArray();
    public abstract java.lang.Object[] toArray(java.util.function.IntFunction);


}

-keep class java.util.stream.Stream$Builder {

    public abstract void accept(java.lang.Object);
    public java.util.stream.Stream$Builder add(java.lang.Object);
    public abstract java.util.stream.Stream build();


}

-keep class javax.microedition.khronos.opengles.GL {



}

-keep class javax.security.auth.Subject {
    <init>();
    <init>(boolean, java.util.Set, java.util.Set, java.util.Set);

    public static java.lang.Object doAs(javax.security.auth.Subject, java.security.PrivilegedAction);
    public static java.lang.Object doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction);
    public static java.lang.Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext);
    public static java.lang.Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext);
    public boolean equals(java.lang.Object);
    public java.util.Set getPrincipals();
    public java.util.Set getPrincipals(java.lang.Class);
    public java.util.Set getPrivateCredentials();
    public java.util.Set getPrivateCredentials(java.lang.Class);
    public java.util.Set getPublicCredentials();
    public java.util.Set getPublicCredentials(java.lang.Class);
    public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
    public int hashCode();
    public boolean isReadOnly();
    public void setReadOnly();
    public java.lang.String toString();


}

-keep class libcore.util.NativeAllocationRegistry {
    <init>(java.lang.ClassLoader, long, long);

    public static void applyFreeFunction(long, long);
    public java.lang.Runnable registerNativeAllocation(java.lang.Object, long);
    public java.lang.Runnable registerNativeAllocation(java.lang.Object, libcore.util.NativeAllocationRegistry$Allocator);


}

-keep class libcore.util.NativeAllocationRegistry$Allocator {

    public abstract long allocate();


}

-keep class org.xmlpull.v1.XmlPullParser {

    public abstract void defineEntityReplacementText(java.lang.String, java.lang.String);
    public abstract int getAttributeCount();
    public abstract java.lang.String getAttributeName(int);
    public abstract java.lang.String getAttributeNamespace(int);
    public abstract java.lang.String getAttributePrefix(int);
    public abstract java.lang.String getAttributeType(int);
    public abstract java.lang.String getAttributeValue(int);
    public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
    public abstract int getColumnNumber();
    public abstract int getDepth();
    public abstract int getEventType();
    public abstract boolean getFeature(java.lang.String);
    public abstract java.lang.String getInputEncoding();
    public abstract int getLineNumber();
    public abstract java.lang.String getName();
    public abstract java.lang.String getNamespace(java.lang.String);
    public abstract java.lang.String getNamespace();
    public abstract int getNamespaceCount(int);
    public abstract java.lang.String getNamespacePrefix(int);
    public abstract java.lang.String getNamespaceUri(int);
    public abstract java.lang.String getPositionDescription();
    public abstract java.lang.String getPrefix();
    public abstract java.lang.Object getProperty(java.lang.String);
    public abstract java.lang.String getText();
    public abstract char[] getTextCharacters(int[]);
    public abstract boolean isAttributeDefault(int);
    public abstract boolean isEmptyElementTag();
    public abstract boolean isWhitespace();
    public abstract int next();
    public abstract int nextTag();
    public abstract java.lang.String nextText();
    public abstract int nextToken();
    public abstract void require(int, java.lang.String, java.lang.String);
    public abstract void setFeature(java.lang.String, boolean);
    public abstract void setInput(java.io.Reader);
    public abstract void setInput(java.io.InputStream, java.lang.String);
    public abstract void setProperty(java.lang.String, java.lang.Object);


    public static int CDSECT;
    public static int COMMENT;
    public static int DOCDECL;
    public static int END_DOCUMENT;
    public static int END_TAG;
    public static int ENTITY_REF;
    public static java.lang.String FEATURE_PROCESS_DOCDECL;
    public static java.lang.String FEATURE_PROCESS_NAMESPACES;
    public static java.lang.String FEATURE_REPORT_NAMESPACE_ATTRIBUTES;
    public static java.lang.String FEATURE_VALIDATION;
    public static int IGNORABLE_WHITESPACE;
    public static java.lang.String NO_NAMESPACE;
    public static int PROCESSING_INSTRUCTION;
    public static int START_DOCUMENT;
    public static int START_TAG;
    public static int TEXT;
    public static java.lang.String[] TYPES;
}

-keep class org.xmlpull.v1.XmlPullParserException {
    <init>(java.lang.String);
    <init>(java.lang.String, org.xmlpull.v1.XmlPullParser, java.lang.Throwable);

    public int getColumnNumber();
    public java.lang.Throwable getDetail();
    public int getLineNumber();
    public void printStackTrace();


    protected int column;
    protected java.lang.Throwable detail;
    protected int row;
}

-keep class org.xmlpull.v1.XmlSerializer {

    public abstract org.xmlpull.v1.XmlSerializer attribute(java.lang.String, java.lang.String, java.lang.String);
    public abstract void cdsect(java.lang.String);
    public abstract void comment(java.lang.String);
    public abstract void docdecl(java.lang.String);
    public abstract void endDocument();
    public abstract org.xmlpull.v1.XmlSerializer endTag(java.lang.String, java.lang.String);
    public abstract void entityRef(java.lang.String);
    public abstract void flush();
    public abstract int getDepth();
    public abstract boolean getFeature(java.lang.String);
    public abstract java.lang.String getName();
    public abstract java.lang.String getNamespace();
    public abstract java.lang.String getPrefix(java.lang.String, boolean);
    public abstract java.lang.Object getProperty(java.lang.String);
    public abstract void ignorableWhitespace(java.lang.String);
    public abstract void processingInstruction(java.lang.String);
    public abstract void setFeature(java.lang.String, boolean);
    public abstract void setOutput(java.io.OutputStream, java.lang.String);
    public abstract void setOutput(java.io.Writer);
    public abstract void setPrefix(java.lang.String, java.lang.String);
    public abstract void setProperty(java.lang.String, java.lang.Object);
    public abstract void startDocument(java.lang.String, java.lang.Boolean);
    public abstract org.xmlpull.v1.XmlSerializer startTag(java.lang.String, java.lang.String);
    public abstract org.xmlpull.v1.XmlSerializer text(java.lang.String);
    public abstract org.xmlpull.v1.XmlSerializer text(char[], int, int);


}

-keep class sun.nio.ch.Interruptible {

    public abstract void interrupt(java.lang.Thread);


}

