1b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot/* 2b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * Copyright (C) 2017 The Android Open Source Project 3b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * 4b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * Licensed under the Apache License, Version 2.0 (the "License"); 5b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * you may not use this file except in compliance with the License. 6b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * You may obtain a copy of the License at 7b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * 8b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * http://www.apache.org/licenses/LICENSE-2.0 9b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * 10b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * Unless required by applicable law or agreed to in writing, software 11b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * distributed under the License is distributed on an "AS IS" BASIS, 12b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * See the License for the specific language governing permissions and 14b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * limitations under the License 15b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot */ 16b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 17b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanotpackage android.app.backup; 18b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 19b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanotimport android.annotation.SystemApi; 20b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanotimport android.os.Bundle; 21b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 22b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot/** 23b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * Callback class for receiving important events during backup/restore operations. 24b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * Events consist mostly of errors and exceptions, giving detailed reason on why a restore/backup 25b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * failed or any time BackupManager makes an important decision. 26b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * On the other hand {@link BackupObserver} will give a failure/success view without 27b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * getting into details why. This callback runs on the thread it was called on because it can get 28b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * a bit spammy. 29b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * These callbacks will run on the binder thread. 30b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * 31b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * @hide 32b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot */ 33b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot@SystemApi 34b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanotpublic class BackupManagerMonitor { 35b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 36b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot // Logging constants for BackupManagerMonitor 37b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final int LOG_EVENT_CATEGORY_TRANSPORT = 1; 38b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final int LOG_EVENT_CATEGORY_AGENT = 2; 39b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final int LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY = 3; 40b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot /** string : the package name */ 41b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final String EXTRA_LOG_EVENT_PACKAGE_NAME = 42b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot "android.app.backup.extra.LOG_EVENT_PACKAGE_NAME"; 43b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot /** int : the versionCode of the package named by EXTRA_LOG_EVENT_PACKAGE_NAME */ 44b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final String EXTRA_LOG_EVENT_PACKAGE_VERSION = 45b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot "android.app.backup.extra.LOG_EVENT_PACKAGE_VERSION"; 46b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot /** int : the id of the log message, will be a unique identifier */ 47b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final String EXTRA_LOG_EVENT_ID = "android.app.backup.extra.LOG_EVENT_ID"; 48b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot /** 49b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * int : category will be one of 50b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * { LOG_EVENT_CATEGORY_TRANSPORT, 51b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * LOG_EVENT_CATEGORY_AGENT, 52b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY}. 53b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot */ 54b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final String EXTRA_LOG_EVENT_CATEGORY = 55b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot "android.app.backup.extra.LOG_EVENT_CATEGORY"; 56b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 57deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 58deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 59deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * boolean: when we have an event with id LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL we record if 60deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * the call was to cancel backup of all packages 61deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 62deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_CANCEL_ALL = "android.app.backup.extra.LOG_CANCEL_ALL"; 63deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 64deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 65deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * string: when we have an event with id LOG_EVENT_ID_ILLEGAL_KEY we send the key that was used 66deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * by the app 67deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 68deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_ILLEGAL_KEY = "android.app.backup.extra.LOG_ILLEGAL_KEY"; 69deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 70deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 71deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * long: when we have an event with id LOG_EVENT_ID_ERROR_PREFLIGHT we send the error code that 72deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * was returned by the transport during preflight 73deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 74deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_PREFLIGHT_ERROR = 75deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_PREFLIGHT_ERROR"; 76deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 77deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 78deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * string: when we have an event with id LOG_EVENT_ID_EXCEPTION_FULL_BACKUP we send the 79deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * exception's stacktrace 80deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 81deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_EXCEPTION_FULL_BACKUP = 82deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_EXCEPTION_FULL_BACKUP"; 83deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 84deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 85deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * int: when we have an event with id LOG_EVENT_ID_RESTORE_VERSION_HIGHER we send the 86deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * restore package version 87deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 88deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_RESTORE_VERSION = 89deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_RESTORE_VERSION"; 90deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 91deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 92deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * boolean: when we have an event with id LOG_EVENT_ID_RESTORE_VERSION_HIGHER we record if 93deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * ApplicationInfo.FLAG_RESTORE_ANY_VERSION flag is set 94deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 95deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_RESTORE_ANYWAY = 96deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_RESTORE_ANYWAY"; 97deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 98deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 99deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 100deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * boolean: when we have an event with id LOG_EVENT_ID_APK_NOT_INSTALLED we record if 101deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * the policy allows to install apks provided with the dataset 102deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 103deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_POLICY_ALLOW_APKS = 104deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_POLICY_ALLOW_APKS"; 105deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 106deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 107deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 108deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * string: when we have an event with id LOG_EVENT_ID_EXPECTED_DIFFERENT_PACKAGE we record the 109deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * package name provided in the restore manifest 110deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 111deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_MANIFEST_PACKAGE_NAME = 112deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_MANIFEST_PACKAGE_NAME"; 113deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 114deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov /** 115deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * string: when we have an event with id LOG_EVENT_ID_WIDGET_METADATA_MISMATCH we record the 116deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * package name provided in the widget metadata 117deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov */ 118deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_WIDGET_PACKAGE_NAME = 119deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov "android.app.backup.extra.LOG_WIDGET_PACKAGE_NAME"; 120deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov 1212815496b3286c56b71601167ec6a12e1e5d16cccStefanot /** 122deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov * int: when we have event of id LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER we send the version 1232815496b3286c56b71601167ec6a12e1e5d16cccStefanot * of the backup. 1242815496b3286c56b71601167ec6a12e1e5d16cccStefanot */ 125deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final String EXTRA_LOG_OLD_VERSION = "android.app.backup.extra.LOG_OLD_VERSION"; 1262815496b3286c56b71601167ec6a12e1e5d16cccStefanot 127b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot // TODO complete this list with all log messages. And document properly. 128deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_FULL_BACKUP_CANCEL = 4; 129deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_ILLEGAL_KEY = 5; 130deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_NO_DATA_TO_SEND = 7; 131deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_PACKAGE_INELIGIBLE = 9; 132deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_PACKAGE_KEY_VALUE_PARTICIPANT = 10; 133deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_PACKAGE_STOPPED = 11; 1342815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_PACKAGE_NOT_FOUND = 12; 135deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_BACKUP_DISABLED = 13; 136deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_DEVICE_NOT_PROVISIONED = 14; 1372815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_PACKAGE_TRANSPORT_NOT_PRESENT = 15; 138deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_ERROR_PREFLIGHT = 16; 139deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_QUOTA_HIT_PREFLIGHT = 18; 140deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_EXCEPTION_FULL_BACKUP = 19; 141deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL = 21; 1422815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE = 22; 143deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_NO_PM_METADATA_RECEIVED = 23; 144deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA = 24; 145deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_LOST_TRANSPORT = 25; 1462815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_PACKAGE_NOT_PRESENT = 26; 147deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_RESTORE_VERSION_HIGHER = 27; 1482815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_APP_HAS_NO_AGENT = 28; 149deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_SIGNATURE_MISMATCH = 29; 1502815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_CANT_FIND_AGENT = 30; 151f4e237c6855fcbb8767695f072174ace1cf801bcStefanot public static final int LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT = 31; 152deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_RESTORE_ANY_VERSION = 34; 153deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_VERSIONS_MATCH = 35; 1542815496b3286c56b71601167ec6a12e1e5d16cccStefanot public static final int LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER = 36; 155deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH = 37; 156deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_SYSTEM_APP_NO_AGENT = 38; 157deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE = 39; 158deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_APK_NOT_INSTALLED = 40; 159deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK = 41; 160deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_MISSING_SIGNATURE = 42; 161deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_EXPECTED_DIFFERENT_PACKAGE = 43; 162deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_UNKNOWN_VERSION = 44; 163f4e237c6855fcbb8767695f072174ace1cf801bcStefanot public static final int LOG_EVENT_ID_FULL_RESTORE_TIMEOUT = 45; 164deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_CORRUPT_MANIFEST = 46; 165deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_WIDGET_METADATA_MISMATCH = 47; 166deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_WIDGET_UNKNOWN_VERSION = 48; 167b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public static final int LOG_EVENT_ID_NO_PACKAGES = 49; 168deb244d3e552fb388dad07d624ae3f38a61d3c23Anton Philippov public static final int LOG_EVENT_ID_TRANSPORT_IS_NULL = 50; 169b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 170b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 171b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot 1722815496b3286c56b71601167ec6a12e1e5d16cccStefanot 1732815496b3286c56b71601167ec6a12e1e5d16cccStefanot 174b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot /** 175b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * This method will be called each time something important happens on BackupManager. 176b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * 177b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * @param event bundle will contain data about event: 178b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * - event id, not optional, a unique identifier for each event. 179b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * - package name, optional, the current package we're backing up/restoring if applicable. 180b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * - package version, optional, the current package version we're backing up/restoring 181b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * if applicable. 182b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * - category of event, not optional, one of 183b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * { LOG_EVENT_CATEGORY_TRANSPORT, 184b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * LOG_EVENT_CATEGORY_AGENT, 185b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY} 186b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot * 187b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot */ 188b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot public void onEvent(Bundle event) { 189b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot } 190b1f573dca3ccdd113ca513f32c9964211ca71c78Stefanot} 191