Best Mockery code snippet using Method.__call
DBConnRef.php
Source:DBConnRef.php
...33 } else {34 throw new InvalidArgumentException( "Missing lazy connection arguments." );35 }36 }37 function __call( $name, array $arguments ) {38 if ( $this->conn === null ) {39 list( $db, $groups, $wiki, $flags ) = $this->params;40 $this->conn = $this->lb->getConnection( $db, $groups, $wiki, $flags );41 }42 return call_user_func_array( [ $this->conn, $name ], $arguments );43 }44 public function getServerInfo() {45 return $this->__call( __FUNCTION__, func_get_args() );46 }47 public function bufferResults( $buffer = null ) {48 return $this->__call( __FUNCTION__, func_get_args() );49 }50 public function trxLevel() {51 return $this->__call( __FUNCTION__, func_get_args() );52 }53 public function trxTimestamp() {54 return $this->__call( __FUNCTION__, func_get_args() );55 }56 public function explicitTrxActive() {57 return $this->__call( __FUNCTION__, func_get_args() );58 }59 public function tablePrefix( $prefix = null ) {60 return $this->__call( __FUNCTION__, func_get_args() );61 }62 public function dbSchema( $schema = null ) {63 return $this->__call( __FUNCTION__, func_get_args() );64 }65 public function getLBInfo( $name = null ) {66 return $this->__call( __FUNCTION__, func_get_args() );67 }68 public function setLBInfo( $name, $value = null ) {69 return $this->__call( __FUNCTION__, func_get_args() );70 }71 public function setLazyMasterHandle( IDatabase $conn ) {72 return $this->__call( __FUNCTION__, func_get_args() );73 }74 public function implicitGroupby() {75 return $this->__call( __FUNCTION__, func_get_args() );76 }77 public function implicitOrderby() {78 return $this->__call( __FUNCTION__, func_get_args() );79 }80 public function lastQuery() {81 return $this->__call( __FUNCTION__, func_get_args() );82 }83 public function doneWrites() {84 return $this->__call( __FUNCTION__, func_get_args() );85 }86 public function lastDoneWrites() {87 return $this->__call( __FUNCTION__, func_get_args() );88 }89 public function writesPending() {90 return $this->__call( __FUNCTION__, func_get_args() );91 }92 public function writesOrCallbacksPending() {93 return $this->__call( __FUNCTION__, func_get_args() );94 }95 public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL ) {96 return $this->__call( __FUNCTION__, func_get_args() );97 }98 public function pendingWriteCallers() {99 return $this->__call( __FUNCTION__, func_get_args() );100 }101 public function pendingWriteRowsAffected() {102 return $this->__call( __FUNCTION__, func_get_args() );103 }104 public function isOpen() {105 return $this->__call( __FUNCTION__, func_get_args() );106 }107 public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {108 return $this->__call( __FUNCTION__, func_get_args() );109 }110 public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {111 return $this->__call( __FUNCTION__, func_get_args() );112 }113 public function restoreFlags( $state = self::RESTORE_PRIOR ) {114 return $this->__call( __FUNCTION__, func_get_args() );115 }116 public function getFlag( $flag ) {117 return $this->__call( __FUNCTION__, func_get_args() );118 }119 public function getProperty( $name ) {120 return $this->__call( __FUNCTION__, func_get_args() );121 }122 public function getDomainID() {123 if ( $this->conn === null ) {124 $domain = $this->params[self::FLD_DOMAIN];125 // Avoid triggering a database connection126 return $domain instanceof DatabaseDomain ? $domain->getId() : $domain;127 }128 return $this->__call( __FUNCTION__, func_get_args() );129 }130 public function getWikiID() {131 return $this->getDomainID();132 }133 public function getType() {134 return $this->__call( __FUNCTION__, func_get_args() );135 }136 public function open( $server, $user, $password, $dbName ) {137 return $this->__call( __FUNCTION__, func_get_args() );138 }139 public function fetchObject( $res ) {140 return $this->__call( __FUNCTION__, func_get_args() );141 }142 public function fetchRow( $res ) {143 return $this->__call( __FUNCTION__, func_get_args() );144 }145 public function numRows( $res ) {146 return $this->__call( __FUNCTION__, func_get_args() );147 }148 public function numFields( $res ) {149 return $this->__call( __FUNCTION__, func_get_args() );150 }151 public function fieldName( $res, $n ) {152 return $this->__call( __FUNCTION__, func_get_args() );153 }154 public function insertId() {155 return $this->__call( __FUNCTION__, func_get_args() );156 }157 public function dataSeek( $res, $row ) {158 return $this->__call( __FUNCTION__, func_get_args() );159 }160 public function lastErrno() {161 return $this->__call( __FUNCTION__, func_get_args() );162 }163 public function lastError() {164 return $this->__call( __FUNCTION__, func_get_args() );165 }166 public function affectedRows() {167 return $this->__call( __FUNCTION__, func_get_args() );168 }169 public function getSoftwareLink() {170 return $this->__call( __FUNCTION__, func_get_args() );171 }172 public function getServerVersion() {173 return $this->__call( __FUNCTION__, func_get_args() );174 }175 public function close() {176 return $this->__call( __FUNCTION__, func_get_args() );177 }178 public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {179 return $this->__call( __FUNCTION__, func_get_args() );180 }181 public function freeResult( $res ) {182 return $this->__call( __FUNCTION__, func_get_args() );183 }184 public function selectField(185 $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []186 ) {187 return $this->__call( __FUNCTION__, func_get_args() );188 }189 public function selectFieldValues(190 $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = []191 ) {192 return $this->__call( __FUNCTION__, func_get_args() );193 }194 public function select(195 $table, $vars, $conds = '', $fname = __METHOD__,196 $options = [], $join_conds = []197 ) {198 return $this->__call( __FUNCTION__, func_get_args() );199 }200 public function selectSQLText(201 $table, $vars, $conds = '', $fname = __METHOD__,202 $options = [], $join_conds = []203 ) {204 return $this->__call( __FUNCTION__, func_get_args() );205 }206 public function selectRow(207 $table, $vars, $conds, $fname = __METHOD__,208 $options = [], $join_conds = []209 ) {210 return $this->__call( __FUNCTION__, func_get_args() );211 }212 public function estimateRowCount(213 $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []214 ) {215 return $this->__call( __FUNCTION__, func_get_args() );216 }217 public function selectRowCount(218 $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = []219 ) {220 return $this->__call( __FUNCTION__, func_get_args() );221 }222 public function fieldExists( $table, $field, $fname = __METHOD__ ) {223 return $this->__call( __FUNCTION__, func_get_args() );224 }225 public function indexExists( $table, $index, $fname = __METHOD__ ) {226 return $this->__call( __FUNCTION__, func_get_args() );227 }228 public function tableExists( $table, $fname = __METHOD__ ) {229 return $this->__call( __FUNCTION__, func_get_args() );230 }231 public function insert( $table, $a, $fname = __METHOD__, $options = [] ) {232 return $this->__call( __FUNCTION__, func_get_args() );233 }234 public function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) {235 return $this->__call( __FUNCTION__, func_get_args() );236 }237 public function makeList( $a, $mode = self::LIST_COMMA ) {238 return $this->__call( __FUNCTION__, func_get_args() );239 }240 public function makeWhereFrom2d( $data, $baseKey, $subKey ) {241 return $this->__call( __FUNCTION__, func_get_args() );242 }243 public function aggregateValue( $valuedata, $valuename = 'value' ) {244 return $this->__call( __FUNCTION__, func_get_args() );245 }246 public function bitNot( $field ) {247 return $this->__call( __FUNCTION__, func_get_args() );248 }249 public function bitAnd( $fieldLeft, $fieldRight ) {250 return $this->__call( __FUNCTION__, func_get_args() );251 }252 public function bitOr( $fieldLeft, $fieldRight ) {253 return $this->__call( __FUNCTION__, func_get_args() );254 }255 public function buildConcat( $stringList ) {256 return $this->__call( __FUNCTION__, func_get_args() );257 }258 public function buildGroupConcatField(259 $delim, $table, $field, $conds = '', $join_conds = []260 ) {261 return $this->__call( __FUNCTION__, func_get_args() );262 }263 public function buildSubstring( $input, $startPosition, $length = null ) {264 return $this->__call( __FUNCTION__, func_get_args() );265 }266 public function buildStringCast( $field ) {267 return $this->__call( __FUNCTION__, func_get_args() );268 }269 public function buildIntegerCast( $field ) {270 return $this->__call( __FUNCTION__, func_get_args() );271 }272 public function buildSelectSubquery(273 $table, $vars, $conds = '', $fname = __METHOD__,274 $options = [], $join_conds = []275 ) {276 return $this->__call( __FUNCTION__, func_get_args() );277 }278 public function databasesAreIndependent() {279 return $this->__call( __FUNCTION__, func_get_args() );280 }281 public function selectDB( $db ) {282 return $this->__call( __FUNCTION__, func_get_args() );283 }284 public function getDBname() {285 return $this->__call( __FUNCTION__, func_get_args() );286 }287 public function getServer() {288 return $this->__call( __FUNCTION__, func_get_args() );289 }290 public function addQuotes( $s ) {291 return $this->__call( __FUNCTION__, func_get_args() );292 }293 public function buildLike() {294 return $this->__call( __FUNCTION__, func_get_args() );295 }296 public function anyChar() {297 return $this->__call( __FUNCTION__, func_get_args() );298 }299 public function anyString() {300 return $this->__call( __FUNCTION__, func_get_args() );301 }302 public function nextSequenceValue( $seqName ) {303 return $this->__call( __FUNCTION__, func_get_args() );304 }305 public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {306 return $this->__call( __FUNCTION__, func_get_args() );307 }308 public function upsert(309 $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__310 ) {311 return $this->__call( __FUNCTION__, func_get_args() );312 }313 public function deleteJoin(314 $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__315 ) {316 return $this->__call( __FUNCTION__, func_get_args() );317 }318 public function delete( $table, $conds, $fname = __METHOD__ ) {319 return $this->__call( __FUNCTION__, func_get_args() );320 }321 public function insertSelect(322 $destTable, $srcTable, $varMap, $conds,323 $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = []324 ) {325 return $this->__call( __FUNCTION__, func_get_args() );326 }327 public function unionSupportsOrderAndLimit() {328 return $this->__call( __FUNCTION__, func_get_args() );329 }330 public function unionQueries( $sqls, $all ) {331 return $this->__call( __FUNCTION__, func_get_args() );332 }333 public function unionConditionPermutations(334 $table, $vars, array $permute_conds, $extra_conds = '', $fname = __METHOD__,335 $options = [], $join_conds = []336 ) {337 return $this->__call( __FUNCTION__, func_get_args() );338 }339 public function conditional( $cond, $trueVal, $falseVal ) {340 return $this->__call( __FUNCTION__, func_get_args() );341 }342 public function strreplace( $orig, $old, $new ) {343 return $this->__call( __FUNCTION__, func_get_args() );344 }345 public function getServerUptime() {346 return $this->__call( __FUNCTION__, func_get_args() );347 }348 public function wasDeadlock() {349 return $this->__call( __FUNCTION__, func_get_args() );350 }351 public function wasLockTimeout() {352 return $this->__call( __FUNCTION__, func_get_args() );353 }354 public function wasConnectionLoss() {355 return $this->__call( __FUNCTION__, func_get_args() );356 }357 public function wasReadOnlyError() {358 return $this->__call( __FUNCTION__, func_get_args() );359 }360 public function wasErrorReissuable() {361 return $this->__call( __FUNCTION__, func_get_args() );362 }363 public function masterPosWait( DBMasterPos $pos, $timeout ) {364 return $this->__call( __FUNCTION__, func_get_args() );365 }366 public function getReplicaPos() {367 return $this->__call( __FUNCTION__, func_get_args() );368 }369 public function getMasterPos() {370 return $this->__call( __FUNCTION__, func_get_args() );371 }372 public function serverIsReadOnly() {373 return $this->__call( __FUNCTION__, func_get_args() );374 }375 public function onTransactionResolution( callable $callback, $fname = __METHOD__ ) {376 return $this->__call( __FUNCTION__, func_get_args() );377 }378 public function onTransactionIdle( callable $callback, $fname = __METHOD__ ) {379 return $this->__call( __FUNCTION__, func_get_args() );380 }381 public function onTransactionPreCommitOrIdle( callable $callback, $fname = __METHOD__ ) {382 return $this->__call( __FUNCTION__, func_get_args() );383 }384 public function setTransactionListener( $name, callable $callback = null ) {385 return $this->__call( __FUNCTION__, func_get_args() );386 }387 public function startAtomic(388 $fname = __METHOD__, $cancelable = IDatabase::ATOMIC_NOT_CANCELABLE389 ) {390 return $this->__call( __FUNCTION__, func_get_args() );391 }392 public function endAtomic( $fname = __METHOD__ ) {393 return $this->__call( __FUNCTION__, func_get_args() );394 }395 public function cancelAtomic( $fname = __METHOD__, AtomicSectionIdentifier $sectionId = null ) {396 return $this->__call( __FUNCTION__, func_get_args() );397 }398 public function doAtomicSection(399 $fname, callable $callback, $cancelable = self::ATOMIC_NOT_CANCELABLE400 ) {401 return $this->__call( __FUNCTION__, func_get_args() );402 }403 public function begin( $fname = __METHOD__, $mode = IDatabase::TRANSACTION_EXPLICIT ) {404 return $this->__call( __FUNCTION__, func_get_args() );405 }406 public function commit( $fname = __METHOD__, $flush = '' ) {407 return $this->__call( __FUNCTION__, func_get_args() );408 }409 public function rollback( $fname = __METHOD__, $flush = '' ) {410 return $this->__call( __FUNCTION__, func_get_args() );411 }412 public function flushSnapshot( $fname = __METHOD__ ) {413 return $this->__call( __FUNCTION__, func_get_args() );414 }415 public function timestamp( $ts = 0 ) {416 return $this->__call( __FUNCTION__, func_get_args() );417 }418 public function timestampOrNull( $ts = null ) {419 return $this->__call( __FUNCTION__, func_get_args() );420 }421 public function ping( &$rtt = null ) {422 return func_num_args()423 ? $this->__call( __FUNCTION__, [ &$rtt ] )424 : $this->__call( __FUNCTION__, [] ); // method cares about null vs missing425 }426 public function getLag() {427 return $this->__call( __FUNCTION__, func_get_args() );428 }429 public function getSessionLagStatus() {430 return $this->__call( __FUNCTION__, func_get_args() );431 }432 public function maxListLen() {433 return $this->__call( __FUNCTION__, func_get_args() );434 }435 public function encodeBlob( $b ) {436 return $this->__call( __FUNCTION__, func_get_args() );437 }438 public function decodeBlob( $b ) {439 return $this->__call( __FUNCTION__, func_get_args() );440 }441 public function setSessionOptions( array $options ) {442 return $this->__call( __FUNCTION__, func_get_args() );443 }444 public function setSchemaVars( $vars ) {445 return $this->__call( __FUNCTION__, func_get_args() );446 }447 public function lockIsFree( $lockName, $method ) {448 return $this->__call( __FUNCTION__, func_get_args() );449 }450 public function lock( $lockName, $method, $timeout = 5 ) {451 return $this->__call( __FUNCTION__, func_get_args() );452 }453 public function unlock( $lockName, $method ) {454 return $this->__call( __FUNCTION__, func_get_args() );455 }456 public function getScopedLockAndFlush( $lockKey, $fname, $timeout ) {457 return $this->__call( __FUNCTION__, func_get_args() );458 }459 public function namedLocksEnqueue() {460 return $this->__call( __FUNCTION__, func_get_args() );461 }462 public function getInfinity() {463 return $this->__call( __FUNCTION__, func_get_args() );464 }465 public function encodeExpiry( $expiry ) {466 return $this->__call( __FUNCTION__, func_get_args() );467 }468 public function decodeExpiry( $expiry, $format = TS_MW ) {469 return $this->__call( __FUNCTION__, func_get_args() );470 }471 public function setBigSelects( $value = true ) {472 return $this->__call( __FUNCTION__, func_get_args() );473 }474 public function isReadOnly() {475 return $this->__call( __FUNCTION__, func_get_args() );476 }477 public function setTableAliases( array $aliases ) {478 return $this->__call( __FUNCTION__, func_get_args() );479 }480 public function setIndexAliases( array $aliases ) {481 return $this->__call( __FUNCTION__, func_get_args() );482 }483 /**484 * Clean up the connection when out of scope485 */486 function __destruct() {487 if ( $this->conn ) {488 $this->lb->reuseConnection( $this->conn );489 }490 }491}492class_alias( DBConnRef::class, 'DBConnRef' );...
__call
Using AI Code Generation
1$method = new Method();2$method->method1();3$method->method2();4$method->method3();5$method->method4();6$method->method5();7$method->method6();8$method->method7();9$method->method8();10$method->method9();11$method->method10();12$method->method11();13$method->method12();14$method->method13();15$method->method14();16$method->method15();17$method->method16();18$method->method17();19$method->method18();20$method->method19();21$method->method20();22$method->method21();23$method->method22();24$method->method23();25$method->method24();26$method->method25();27$method->method26();28$method->method27();29$method->method28();30$method->method29();31$method->method30();32$method->method31();33$method->method32();34$method->method33();35$method->method34();36$method->method35();37$method->method36();38$method->method37();39$method->method38();40$method->method39();41$method->method40();42$method->method41();43$method->method42();44$method->method43();45$method->method44();46$method->method45();47$method->method46();48$method->method47();49$method->method48();50$method->method49();51$method->method50();52$method->method51();53$method->method52();54$method->method53();55$method->method54();56$method->method55();57$method->method56();58$method->method57();59$method->method58();60$method->method59();61$method->method60();62$method->method61();63$method->method62();64$method->method63();65$method->method64();66$method->method65();67$method->method66();68$method->method67();69$method->method68();70$method->method69();71$method->method70();72$method->method71();73$method->method72();74$method->method73();75$method->method74();76$method->method75();77$method->method76();78$method->method77();79$method->method78();80$method->method79();81$method->method80();82$method->method81();83$method->method82();
__call
Using AI Code Generation
1$obj = new Method();2$obj->foo();3$obj = new Method();4$obj->foo();5$obj = new Method();6$obj->foo();7$obj = new Method();8$obj->foo();9$obj = new Method();10$obj->foo();11$obj = new Method();12$obj->foo();13$obj = new Method();14$obj->foo();15$obj = new Method();16$obj->foo();17$obj = new Method();18$obj->foo();19$obj = new Method();20$obj->foo();21$obj = new Method();22$obj->foo();23$obj = new Method();24$obj->foo();25$obj = new Method();26$obj->foo();27$obj = new Method();28$obj->foo();29$obj = new Method();30$obj->foo();31$obj = new Method();32$obj->foo();33$obj = new Method();34$obj->foo();35$obj = new Method();36$obj->foo();37$obj = new Method();38$obj->foo();
__call
Using AI Code Generation
1$obj=new Method();2$obj->method1();3$obj->method2();4$obj=new Method();5$obj->method1();6$obj->method2();7$obj=new Method();8$obj->method1();9$obj->method2();10Related Posts: PHP: __callStatic() magic method11PHP: __get() magic method12PHP: __set() magic method13PHP: __isset() magic method14PHP: __unset() magic method15PHP: __sleep() magic method16PHP: __wakeup() magic method17PHP: __toString() magic method18PHP: __invoke() magic method19PHP: __set_state() magic method20PHP: __clone() magic method21PHP: __debugInfo() magic method22PHP: __autoload() magic method23PHP: __construct() magic method24PHP: __destruct() magic method25PHP: __call() magic method26PHP: __callStatic() magic method27PHP: __get() magic method28PHP: __set() magic method29PHP: __isset() magic method30PHP: __unset() magic method31PHP: __sleep() magic method32PHP: __wakeup() magic method33PHP: __toString() magic method34PHP: __invoke() magic method35PHP: __set_state() magic method36PHP: __clone() magic method37PHP: __debugInfo() magic method38PHP: __autoload() magic method39PHP: __construct() magic method40PHP: __destruct() magic method41PHP: __call() magic method42PHP: __callStatic() magic method43PHP: __get() magic method44PHP: __set() magic method45PHP: __isset() magic method46PHP: __unset() magic method47PHP: __sleep() magic method48PHP: __wakeup() magic method49PHP: __toString() magic method50PHP: __invoke() magic method51PHP: __set_state() magic method52PHP: __clone() magic method53PHP: __debugInfo() magic method54PHP: __autoload() magic method55PHP: __construct() magic method56PHP: __destruct() magic method
__call
Using AI Code Generation
1$obj = new Method();2$obj->method1();3$obj->method2();4Method::method1();5Method::method2();6$obj = new Method();7$obj->method1();8$obj->method2();9Method::method1();10Method::method2();
__call
Using AI Code Generation
1$method = new Method;2$method->method1();3$method->method2();4$method->method3();5$method->method4();6PHP | __callStatic() Magic Method7PHP | __set_state() Magic Method8PHP | __set() Magic Method9PHP | __get() Magic Method10PHP | __isset() Magic Method11PHP | __unset() Magic Method12PHP | __sleep() Magic Method13PHP | __wakeup() Magic Method14PHP | __toString() Magic Method15PHP | __invoke() Magic Method16PHP | __debugInfo() Magic Method17PHP | __clone() Magic Method18PHP | __destruct() Magic Method19PHP | __construct() Magic Method20PHP | __autoload() Magic Method
__call
Using AI Code Generation
1$method = new Method();2$method->call('sayHello', 'John');3$method->call('sayHello', 'John', 'Smith');4$method->call('sayHello', 'John', 'Smith', 'Doe');5Method::callStatic('sayHello', 'John');6Method::callStatic('sayHello', 'John', 'Smith');7Method::callStatic('sayHello', 'John', 'Smith', 'Doe');8$method = new Method();9$method->sayHello('John');10$method->sayHello('John', 'Smith');11$method->sayHello('John', 'Smith', 'Doe');12Method::sayHello('John');13Method::sayHello('John', 'Smith');14Method::sayHello('John', 'Smith', 'Doe');15{16 public function __call($name, $arguments)17 {18 if (is_callable($name)) {19 call_user_func_array($name, $arguments);20 } else {21 throw new BadMethodCallException("Method $name does not exist.");22 }23 }24 public static function __callStatic($name, $arguments)25 {26 if (is_callable($name)) {27 call_user_func_array($name, $arguments);28 } else {29 throw new BadMethodCallException("Method $name does not exist.");30 }31 }32}
__call
Using AI Code Generation
1$obj = new Method();2$obj->methodOne();3$obj->methodTwo();4$obj->methodThree();5$obj->methodFour();6Related Posts: PHP ReflectionClass::__callStatic() Method7PHP ReflectionClass::__call() Method8PHP ReflectionClass::__clone() Method9PHP ReflectionClass::__construct() Method10PHP ReflectionClass::__destruct() Method11PHP ReflectionClass::__get() Method12PHP ReflectionClass::__isset() Method13PHP ReflectionClass::__set() Method14PHP ReflectionClass::__set_state() Method15PHP ReflectionClass::__sleep() Method16PHP ReflectionClass::__toString() Method17PHP ReflectionClass::__unset() Method18PHP ReflectionClass::__wakeup() Method19PHP ReflectionClass::__set_state() Method20PHP ReflectionClass::__clone() Method
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Execute automation tests with __call on a cloud-based Grid of 3000+ real browsers and operating systems for both web and mobile applications.
Test now for FreeGet 100 minutes of automation test minutes FREE!!