-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 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 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_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.Path);
    public static android.view.DisplayCutout fromResources(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);


}

