citadel.git
13 years agoLibev / libc-ares Migration
Wilfried Goesgens [Mon, 10 Jan 2011 22:38:36 +0000 (23:38 +0100)]
Libev / libc-ares Migration

  - Bounce-o-matic:
   - use parsend Queue structure instead of parsing the queue message ourselves
   - only Compose the bounce message, if we're shure we'll need it
   - malloc all memory first, and fail if..
  - restructure Message Queue documentation
  - parse not yet identified Submitted-Header into queue item
  - Alloc QueueItem->StatusMessage on creation so we have it easier writing it later

  - Start implementing timeout/abort conditions

  - c-ares integration: start/stop the right event-watchers
  - c-ares integration: give it its own watcher structs

13 years agolibev/libc-ares migration
Wilfried Goesgens [Sat, 8 Jan 2011 21:31:34 +0000 (22:31 +0100)]
libev/libc-ares migration

  - no, c-ares does need a write and a send wrapper.

13 years agolibev smtp migration
Wilfried Goesgens [Sat, 8 Jan 2011 19:55:44 +0000 (20:55 +0100)]
libev smtp migration

  - pass message text into bounce message
  - split SMTP <-> SMTP-Queue code

13 years agolibev migration
Wilfried Goesgens [Sat, 8 Jan 2011 17:54:03 +0000 (18:54 +0100)]
libev migration

  Cleanup: wrap an empty do {} while (0) around our macros, so their syntax gets a better feeling of c-functions

13 years agolibev migration
Wilfried Goesgens [Sat, 8 Jan 2011 17:50:16 +0000 (18:50 +0100)]
libev migration

  - log when looking up the IP of an MX
  - log when attepting to connect one MX

13 years agoLibev/libc-ares migration: cleanup
Wilfried Goesgens [Sat, 8 Jan 2011 17:32:56 +0000 (18:32 +0100)]
Libev/libc-ares migration: cleanup

13 years agolibev-migration
Wilfried Goesgens [Sat, 8 Jan 2011 16:17:06 +0000 (17:17 +0100)]
libev-migration

  - got the wrong interpretation of the pointer;

First mails leave citadel after a successfull DNS-Query!

13 years agolibc-ares migration
Wilfried Goesgens [Sat, 8 Jan 2011 16:16:18 +0000 (17:16 +0100)]
libc-ares migration

  - ev_io_stop removes us from the list, but we still want to receive stuff.

13 years agolibc-ares migration
Wilfried Goesgens [Sat, 8 Jan 2011 14:13:18 +0000 (15:13 +0100)]
libc-ares migration

  - just use one callback for read/send into libevent
  - re-enable c-ares; still doesn't work

13 years agolibev migration
Wilfried Goesgens [Sat, 8 Jan 2011 10:41:56 +0000 (11:41 +0100)]
libev migration

 - libevent doesn't require a special async connect mechanic, remove it.

13 years agolibev/libc-ares migration
Wilfried Goesgens [Fri, 7 Jan 2011 11:05:22 +0000 (12:05 +0100)]
libev/libc-ares migration

 - disable c-ares for now
 - add fixed ip to connect instead of looked up ip

13 years agolibev migration - shutdown cleanly.
Wilfried Goesgens [Fri, 7 Jan 2011 11:04:21 +0000 (12:04 +0100)]
libev migration - shutdown cleanly.

13 years agolibev/libc-ares migration
Wilfried Goesgens [Tue, 4 Jan 2011 23:28:13 +0000 (00:28 +0100)]
libev/libc-ares migration

 - resolving of the ip address is working now too; handling whether its an ipv6 host still missing.
 - libev doesn't succeed on doing async connect()

13 years agolibc-ares migration
Wilfried Goesgens [Mon, 3 Jan 2011 23:33:30 +0000 (00:33 +0100)]
libc-ares migration

  - call the ares read/write handlers in our registered read/write callbacks
  - set context appropriate.

13 years agolibev migration
Wilfried Goesgens [Mon, 3 Jan 2011 23:33:00 +0000 (00:33 +0100)]
libev migration

  - fix spawning of event-queue thread.

13 years agolibev/libc-ares migration
Wilfried Goesgens [Mon, 3 Jan 2011 23:00:47 +0000 (00:00 +0100)]
libev/libc-ares migration

  - move c-ares query into the eventqueue context
  - queueing of the new context via the pipe doesn't work anymore with libev

13 years agolibc-ares migration - first implementation draft
Wilfried Goesgens [Mon, 3 Jan 2011 15:36:43 +0000 (16:36 +0100)]
libc-ares migration - first implementation draft

 - dns queries are going out, but the reply isn't read so far.

13 years agolibev migration
Wilfried Goesgens [Sat, 1 Jan 2011 18:14:51 +0000 (19:14 +0100)]
libev migration

 - make connect() async; add wrappers in event_client to abstract it to our clients
 - switch libevent -> libev
 - start abstraction for dns asynchronisation via c-ares

13 years agoLibev / libcares : add build dependencies
Wilfried Goesgens [Sat, 1 Jan 2011 17:00:42 +0000 (18:00 +0100)]
Libev / libcares : add build dependencies

13 years agolibevent migration: discarded, make this libev
Wilfried Goesgens [Sat, 1 Jan 2011 16:59:50 +0000 (17:59 +0100)]
libevent migration: discarded, make this libev

  - detect c-ares
  - detect libev

13 years agoLibevent Migration
Wilfried Goesgens [Mon, 27 Dec 2010 15:45:53 +0000 (16:45 +0100)]
Libevent Migration

  - use a bigger read buffer for the smtp client
  - differentiate between queue and smtp client in log messages
  - migrate scheduling of jobs to a locked list

13 years agoLibevent Migration
Wilfried Goesgens [Mon, 27 Dec 2010 15:39:16 +0000 (16:39 +0100)]
Libevent Migration

 - change the place where we check the space for the \0 for reading
 - we didn't check the case to increase the buffer while reading if the reading algorithm didn't find a complete line yet...

13 years agoHashlist: add function to flush the contents of a hashlist.
Wilfried Goesgens [Mon, 27 Dec 2010 15:38:30 +0000 (16:38 +0100)]
Hashlist: add function to flush the contents of a hashlist.

13 years agoLibevent Migration
Wilfried Goesgens [Sun, 26 Dec 2010 12:23:42 +0000 (13:23 +0100)]
Libevent Migration

 - handle the SMTP-reply-stati in a propper way
 - skip empty lines while serializing messages

13 years agoStrBuf_NextToken: if the source is empty, flush the target.
Wilfried Goesgens [Sun, 26 Dec 2010 12:22:55 +0000 (13:22 +0100)]
StrBuf_NextToken: if the source is empty, flush the target.

13 years agolibevent Migration:
Wilfried Goesgens [Sun, 26 Dec 2010 10:56:41 +0000 (11:56 +0100)]
libevent Migration:

 - hook in libevent into shutdown mechanism, so we can cleanly shutdown citserver again.

13 years agolibevent Migration
Wilfried Goesgens [Sun, 26 Dec 2010 10:40:54 +0000 (11:40 +0100)]
libevent Migration

 - add a state 'terminate' to the event handlers
 - use the Terminate-callback to free all members.

13 years agoLibevent Integration
Wilfried Goesgens [Thu, 23 Dec 2010 00:09:14 +0000 (01:09 +0100)]
Libevent Integration

 - move bounce into util
 - rewrite parsing of queue entry; keep structure in memory, serialize after last message is sent.

13 years agoLibevent integration
Wilfried Goesgens [Tue, 21 Dec 2010 23:40:34 +0000 (00:40 +0100)]
Libevent integration

 - add a configure option --with-experimental_eventsmtp to enable the following items
 - add a thread that spawns a signaling pipe plus the libevent queue
 - add functions that allow to add jobs via that signalling pipe
 - add experimental smtp queue handler sending messages via libevent (message goes out but then... ;-)

13 years agolibevent integration
Wilfried Goesgens [Tue, 21 Dec 2010 23:37:55 +0000 (00:37 +0100)]
libevent integration

 - Add functions that are able to do just one read()/write() so they can be used as libevent callbacks.
 - Add linereader function that reads from "incomplete buffers" and falls back to a re-attemt if not enough data is available.

13 years agoReplaced client_read() with socket_read_blob() in serv_network.c
Art Cancro [Mon, 20 Dec 2010 04:12:19 +0000 (23:12 -0500)]
Replaced client_read() with socket_read_blob() in serv_network.c

13 years agoCleaned up the loop that receives network spool. NOT THE FIX
Art Cancro [Fri, 17 Dec 2010 19:12:36 +0000 (14:12 -0500)]
Cleaned up the loop that receives network spool.  NOT THE FIX

13 years agoContent-transfer-encoding: ISO-8859-1 joins the 'no encoding' list
Art Cancro [Fri, 17 Dec 2010 04:10:06 +0000 (23:10 -0500)]
Content-transfer-encoding: ISO-8859-1 joins the 'no encoding' list

13 years agoMove: give the SMTP-Client its own file.
Wilfried Goesgens [Wed, 15 Dec 2010 11:44:57 +0000 (12:44 +0100)]
Move: give the SMTP-Client its own file.

 - move the SMTP-Client functionality into its own file.
 - re-bootstrap so the new files are added to your makefiles!

13 years agoRoom info in banner should respect utf8 when cutting the text; fixed.
Wilfried Goesgens [Wed, 15 Dec 2010 09:03:03 +0000 (10:03 +0100)]
Room info in banner should respect utf8 when cutting the text; fixed.

13 years agoRoom info in banner was completely broken. Fixed.
Art Cancro [Tue, 14 Dec 2010 22:13:03 +0000 (17:13 -0500)]
Room info in banner was completely broken.  Fixed.

13 years agoSMTP Async I/O:
Wilfried Goesgens [Mon, 13 Dec 2010 17:23:31 +0000 (18:23 +0100)]
SMTP Async I/O:

 - while sending data, wait relative to the size of the mail /128 + a minimal set of 50.

13 years agoJ-escape instead of U-escape attachment removal urls.
Art Cancro [Mon, 13 Dec 2010 15:12:25 +0000 (10:12 -0500)]
J-escape instead of U-escape attachment removal urls.

13 years agoremove attach works now but has filename escape bugs
Art Cancro [Mon, 13 Dec 2010 05:02:22 +0000 (00:02 -0500)]
remove attach works now but has filename escape bugs

13 years agourl binding and skeleton js for remove attachment
Art Cancro [Mon, 13 Dec 2010 00:29:21 +0000 (19:29 -0500)]
url binding and skeleton js for remove attachment

13 years agoWrote the ajax call for remove_attachment(), todo: js binding
Art Cancro [Mon, 13 Dec 2010 00:11:39 +0000 (19:11 -0500)]
Wrote the ajax call for remove_attachment(), todo: js binding

13 years agoMimeparser Bugfix
Wilfried Goesgens [Sun, 12 Dec 2010 14:47:14 +0000 (15:47 +0100)]
Mimeparser Bugfix

 - use the right pointer to calculate the terminal border of the first memchr

13 years agoIgnore all of our test binaries.
Wilfried Goesgens [Sun, 12 Dec 2010 14:09:49 +0000 (15:09 +0100)]
Ignore all of our test binaries.

13 years agoAdd possibility to trigger the tests with Valgrind
Wilfried Goesgens [Sun, 12 Dec 2010 14:06:09 +0000 (15:06 +0100)]
Add possibility to trigger the tests with Valgrind

13 years agoBugfix: several errors in our test program
Wilfried Goesgens [Sun, 12 Dec 2010 14:03:43 +0000 (15:03 +0100)]
Bugfix: several errors in our test program

 - initialize the count before passing it into wildfirea
 - free all our buffers properly.

13 years agoBugfixing: free our hashpositions...
Wilfried Goesgens [Sun, 12 Dec 2010 14:02:40 +0000 (15:02 +0100)]
Bugfixing: free our hashpositions...

13 years agoAttachments count is now updated in navbar
Art Cancro [Sun, 12 Dec 2010 03:15:35 +0000 (22:15 -0500)]
Attachments count is now updated in navbar

13 years agoShow throbber during attachment upload
Art Cancro [Sun, 12 Dec 2010 02:23:16 +0000 (21:23 -0500)]
Show throbber during attachment upload

13 years agoHide upload box during an upload. TODO: add throbber.
Art Cancro [Sat, 11 Dec 2010 22:24:06 +0000 (17:24 -0500)]
Hide upload box during an upload.  TODO: add throbber.

13 years agoremove image borders in the upload pane
Art Cancro [Sat, 11 Dec 2010 17:41:31 +0000 (12:41 -0500)]
remove image borders in the upload pane

13 years agoChange 'Attach' to 'Attachments: 0' (updater will follow)
Art Cancro [Sat, 11 Dec 2010 17:36:13 +0000 (12:36 -0500)]
Change 'Attach' to 'Attachments: 0' (updater will follow)

13 years agoIntegrate IGs tests
Wilfried Goesgens [Sat, 11 Dec 2010 15:36:07 +0000 (16:36 +0100)]
Integrate IGs tests

 - add to run_tests.sh
 - wrap c-unit around the test cases...

13 years agoNew upload dialog is now feature complete
Art Cancro [Sat, 11 Dec 2010 02:23:52 +0000 (21:23 -0500)]
New upload dialog is now feature complete

13 years agoUploading now works. It is ugly but it works.
Art Cancro [Fri, 10 Dec 2010 21:25:51 +0000 (16:25 -0500)]
Uploading now works.  It is ugly but it works.

13 years agoPerform uploads via a (eventually to be hidden) iframe
Art Cancro [Fri, 10 Dec 2010 21:18:58 +0000 (16:18 -0500)]
Perform uploads via a (eventually to be hidden) iframe

13 years agoMerge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
Art Cancro [Fri, 10 Dec 2010 18:31:54 +0000 (13:31 -0500)]
Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel

13 years agoMimeparser Bugfix:
Wilfried Goesgens [Fri, 10 Dec 2010 18:14:35 +0000 (19:14 +0100)]
Mimeparser Bugfix:

 - while parsing the headers, don't forget to \0 the extracted strings.

13 years agoPerformance improvement / Bugfix Mime handling while outputting messages:
Wilfried Goesgens [Fri, 10 Dec 2010 18:13:28 +0000 (19:13 +0100)]
Performance improvement / Bugfix Mime handling while outputting messages:

  - we switched to decode just that part we'd want to output, we should choose the pointer with the decoded buffer.

13 years agoMerge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
Art Cancro [Fri, 10 Dec 2010 17:26:25 +0000 (12:26 -0500)]
Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel

13 years agoReworking the enter message and attach dialogs
Art Cancro [Fri, 10 Dec 2010 17:26:22 +0000 (12:26 -0500)]
Reworking the enter message and attach dialogs

13 years agoFix typo in translation.
Wilfried Goesgens [Fri, 10 Dec 2010 17:18:12 +0000 (18:18 +0100)]
Fix typo in translation.

13 years agoMimeparser bugfix; if we continue we must flush the already parsed headers too.
Wilfried Goesgens [Fri, 10 Dec 2010 17:14:40 +0000 (18:14 +0100)]
Mimeparser bugfix; if we continue we must flush the already parsed headers too.

13 years agoHunt for mime_parser bugs...
Wilfried Goesgens [Fri, 10 Dec 2010 16:08:54 +0000 (17:08 +0100)]
Hunt for mime_parser bugs...

 - don't prepend the content-type/content-length - mime header if we don't intend to use it anyways.

13 years agoMerge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
Art Cancro [Thu, 9 Dec 2010 17:07:24 +0000 (12:07 -0500)]
Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel

13 years agoMore tiny bugfixes on the mimeparser
Wilfried Goesgens [Thu, 9 Dec 2010 00:05:16 +0000 (01:05 +0100)]
More tiny bugfixes on the mimeparser

 - in the for-loop, search first start as initializer, this saves one unneccesary memcmp
 - cr/lf detection: we need to do that _before_ the first mime content is evaluated.

13 years agoMerge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
Art Cancro [Wed, 8 Dec 2010 14:04:52 +0000 (09:04 -0500)]
Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel

13 years agoAdded the regression test I wrote while fixing stripallbut() yesterday
Art Cancro [Wed, 8 Dec 2010 03:17:47 +0000 (22:17 -0500)]
Added the regression test I wrote while fixing stripallbut() yesterday

13 years agoCorrectly evaluate whether we have a decoded mime part, or if we need to output the...
Wilfried Goesgens [Tue, 7 Dec 2010 22:30:12 +0000 (23:30 +0100)]
Correctly evaluate whether we have a decoded mime part, or if we need to output the raw content.

13 years agoPerformance: use memchr to find the next '-' and then call memcmp to check whether...
Wilfried Goesgens [Tue, 7 Dec 2010 22:20:43 +0000 (23:20 +0100)]
Performance: use memchr to find the next '-' and then call memcmp to check whether this is a boundary

 - we fast forward to the next '-' since every mime boundary starts with '-'
 - from a '-' we check thorough whether at this point we can find the searched boundary

Thanks to cirrus for pointing me to memchr()

13 years agoAdd more test-mimecontainers.
Wilfried Goesgens [Tue, 7 Dec 2010 21:27:52 +0000 (22:27 +0100)]
Add more test-mimecontainers.

13 years agoBe more conservative about when not to apply binary searching for the next boundary...
Wilfried Goesgens [Tue, 7 Dec 2010 21:24:49 +0000 (22:24 +0100)]
Be more conservative about when not to apply binary searching for the next boundary or not.

13 years agoRewrote stripallbut() again, tested extensively
Art Cancro [Tue, 7 Dec 2010 16:31:35 +0000 (11:31 -0500)]
Rewrote stripallbut() again, tested extensively

13 years agoAdd test running our wildfire sample code
Wilfried Goesgens [Sun, 5 Dec 2010 16:31:26 +0000 (17:31 +0100)]
Add test running our wildfire sample code

13 years agoIn the name of test-coverage: #if 0 the parts we don't need.
Wilfried Goesgens [Sun, 5 Dec 2010 16:30:40 +0000 (17:30 +0100)]
In the name of test-coverage: #if 0 the parts we don't need.

13 years agoDon't forget to cleanup gcov output in xdgmime
Wilfried Goesgens [Sun, 5 Dec 2010 16:14:43 +0000 (17:14 +0100)]
Don't forget to cleanup gcov output in xdgmime

13 years agoMore shell calls to all our tests
Wilfried Goesgens [Sun, 5 Dec 2010 14:47:18 +0000 (15:47 +0100)]
More shell calls to all our tests

 - look up all our staticaly coded mimetypes from randomly generated filenames
 - read all contents we find across all test mimecontainers.

13 years agoAdd test for loading one mimepart from the mimestructure; decode its content inside.
Wilfried Goesgens [Sun, 5 Dec 2010 14:45:21 +0000 (15:45 +0100)]
Add test for loading one mimepart from the mimestructure; decode its content inside.

 - this found a bug of a const char being modified inside of the call.

13 years agoAdd test for looking up the icon for a specific mimetype.
Wilfried Goesgens [Sun, 5 Dec 2010 14:43:46 +0000 (15:43 +0100)]
Add test for looking up the icon for a specific mimetype.

13 years agoDon't put a static buffer into content_encoding; its changed inside.
Wilfried Goesgens [Sun, 5 Dec 2010 14:41:19 +0000 (15:41 +0100)]
Don't put a static buffer into content_encoding; its changed inside.

 - while decoding thats overwritten. probably a bug sleeping in here waiting for its discovery for a long time.

13 years agoUpdate to launchpad R24
Wilfried Goesgens [Thu, 2 Dec 2010 00:20:40 +0000 (01:20 +0100)]
Update to launchpad R24

 - remove fuzzy strings, launchpad doesn't support them
 - add new translation

13 years agoadd scripts to run and test and have code coverage analysis across them.
Wilfried Goesgens [Thu, 2 Dec 2010 00:18:28 +0000 (01:18 +0100)]
add scripts to run and test and have code coverage analysis across them.

13 years agoAdd possibility to trigger the mimeparser internal encoding-decoder
Wilfried Goesgens [Thu, 2 Dec 2010 00:17:05 +0000 (01:17 +0100)]
Add possibility to trigger the mimeparser internal encoding-decoder

13 years agoTestdata: add an email with base64 encoded content.
Wilfried Goesgens [Thu, 2 Dec 2010 00:14:53 +0000 (01:14 +0100)]
Testdata: add an email with base64 encoded content.

13 years agoRemove loop, its a little unfriendly to run it a 10000 times.
Wilfried Goesgens [Thu, 2 Dec 2010 00:14:10 +0000 (01:14 +0100)]
Remove loop, its a little unfriendly to run it a 10000 times.

13 years agoAdd test to call mime lookup algorithms
Wilfried Goesgens [Thu, 2 Dec 2010 00:11:41 +0000 (01:11 +0100)]
Add test to call mime lookup algorithms

13 years agoIgnore more missing .gcov files
Wilfried Goesgens [Thu, 2 Dec 2010 00:10:41 +0000 (01:10 +0100)]
Ignore more missing .gcov files

13 years agoMerge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
Wilfried Goesgens [Wed, 1 Dec 2010 21:25:57 +0000 (22:25 +0100)]
Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel

13 years agoResync to launchpad translation add Bulgarian
Wilfried Goesgens [Wed, 1 Dec 2010 21:24:13 +0000 (22:24 +0100)]
Resync to launchpad translation add Bulgarian

 - remove fuzzy strings, launchpad doesn't have them and patching chokes on them

13 years agoIgnore gcov generated files.
Wilfried Goesgens [Wed, 1 Dec 2010 19:40:30 +0000 (20:40 +0100)]
Ignore gcov generated files.

13 years agoDismissing the popup-is-blocked window now opens it (hopefully)
Art Cancro [Tue, 30 Nov 2010 09:04:37 +0000 (04:04 -0500)]
Dismissing the popup-is-blocked window now opens it (hopefully)

13 years agotoggleModal() now explicitly accepts an argument of 1 (on) or 0 (off)
Art Cancro [Tue, 30 Nov 2010 08:57:00 +0000 (03:57 -0500)]
toggleModal() now explicitly accepts an argument of 1 (on) or 0 (off)

13 years agoModal dialog for the popup blocker warning
Art Cancro [Tue, 30 Nov 2010 08:40:45 +0000 (03:40 -0500)]
Modal dialog for the popup blocker warning

13 years agofix stupidness in closewindow icon
Art Cancro [Tue, 30 Nov 2010 08:03:05 +0000 (03:03 -0500)]
fix stupidness in closewindow icon

13 years agomake the cancel button 32x32
Art Cancro [Tue, 30 Nov 2010 07:57:28 +0000 (02:57 -0500)]
make the cancel button 32x32

13 years agoUse modal dialog for confirm logoff
Art Cancro [Tue, 30 Nov 2010 06:52:24 +0000 (01:52 -0500)]
Use modal dialog for confirm logoff

13 years agoIntegrated a modal dialog framework (not in use yet)
Art Cancro [Tue, 30 Nov 2010 06:11:43 +0000 (01:11 -0500)]
Integrated a modal dialog framework (not in use yet)

13 years agoMemleak: getaddrinfo needs freeadrinfo here too.
Wilfried Goesgens [Sun, 28 Nov 2010 20:02:00 +0000 (21:02 +0100)]
Memleak: getaddrinfo needs freeadrinfo here too.

13 years agoMime-parser rework: parse the mime headers of the current container so we can guess...
Wilfried Goesgens [Sun, 28 Nov 2010 18:46:18 +0000 (19:46 +0100)]
Mime-parser rework: parse the mime headers of the current container so we can guess the size of the content to jump accross; binary/ascii is used to switch the search algorithm for the next boundary.

 - the old mime parser version skipped empty containers; we do this by hand
 - for some reason the numbers addressing the mimeparts grow different, maybe mixed use of old/new may cause confusion...

13 years agoExclude testdata from the distribution tgzs; they don't need it and they're huge.
Wilfried Goesgens [Sat, 27 Nov 2010 13:15:51 +0000 (14:15 +0100)]
Exclude testdata from the distribution tgzs; they don't need it and they're huge.

13 years agoAnonimize?
Wilfried Goesgens [Sat, 27 Nov 2010 13:11:18 +0000 (14:11 +0100)]
Anonimize?