Thanks a lot Daniel, Maybe you can create basic "Privacy Statement" based on this [1] one (public domain) And we can polish it in mailing list?
I definitely wrong person for this :(( [1] https://help.github.com/articles/github-privacy-statement/ On Thu, May 10, 2018 at 11:44 PM, Daniel Ascher <[email protected]> wrote: > Sure! Happy to help with this. :) > > Please send me the text once it's ready and I'll review it and discuss > issues with the group. > > Thanks! Dan > > On Thu, May 10, 2018 at 12:36 PM, Maxim Solodovnik <[email protected]> > wrote: > >> Hello Peter, All, >> >> Just have added link to privacy policy to register dialog (available at >> upcoming build, will update demo ASAP) >> >> Would appreciate is *Native English Speaker* can help with English >> privacy statement >> I'll try to create one based on this [1], but I would strongly prefer to >> get help with this task >> >> @Daniel, maybe you can help? >> >> According to restoration of deleted user, I'll try to invent something >> .... (don't like the idea of adding additional "purged" flag) >> >> [1] https://help.github.com/articles/github-privacy-statement/ >> >> On Thu, Apr 26, 2018 at 7:12 PM, Peter Dähn <[email protected]> wrote: >> >>> Hi Maxim, >>> >>> I've tested the current state. Seems to be done so far. One little thing >>> I hope... When I choose a purged user I have the possibility (button) to >>> restore that account. Db will be set deleted false... Doesn't make sense, I >>> think. >>> >>> Purge themselves is a way to disagree (I didn't see it till now...), I >>> think. But a few more clicks are needed to get to that point... But I think >>> this is ok as long as nobody complain about it. This function need to be >>> described in the privacy policy. I hope thats it... >>> >>> Almost all done? Maybe someone else could also test this. >>> >>> Do you mean the a sample privacy policy here? *"And maybe you can >>> provide sample "personal data agreement" text?"* >>> >>> I think at least for english... This is a task for a native speaker... >>> In UK they also need to be compliant with GDPR. Maybe someone from there >>> could provide some text. >>> >>> Greetings Peter >>> >>> >>> Am 26.04.2018 um 12:04 schrieb Maxim Solodovnik: >>> >>> As per current implementation users can purge themselves >>> This can't be undone .... >>> >>> Is this "a way to disagree" ? >>> >>> On Thu, Apr 26, 2018 at 2:35 PM, Peter Dähn <[email protected]> wrote: >>> >>>> Hi Maxim, >>>> >>>> I will test it during the day.... >>>> >>>> Yes you are right... This need to be done during registration. checkbox >>>> and link to the privacy policy that need to be placed somewhere. >>>> >>>> Agreement for data processing need to be double opt-in. Most likely via >>>> E-Mail. I think an e-mail template that could be changed easily is the most >>>> flexible way. >>>> >>>> And there should a way to disagree further data-processing. "The way to >>>> disagree need to be as easy as the way to agree"... My understanding: that >>>> would be our "soft delete"... If this is used, there should be a way for >>>> the user to reactivate this account. E.g. check registration e-mail and if >>>> it is soft deleted the registration confirm e-mail could have the option to >>>> reactivate the old account or generate a new one >>>> >>>> Back later, when I've tested current build >>>> Greetings Peter >>>> >>>> >>>> >>>> Am 26.04.2018 um 08:09 schrieb Maxim Solodovnik: >>>> >>>> All your comments should be addressed in latest build available >>>> >>>> Could you please re-check? >>>> >>>> This question was not answered ..... >>>> >>>> Additional question: >>>> "Registration-Dialog need to have a button/step to agree the data >>>> processing. And to this belongs a button to disagree." >>>> >>>> I guess user should be able to register only if he/she agree to data >>>> processing >>>> Registration should be impossible if user disagree >>>> So I guess having following controls at registration dialog would be >>>> sufficient: >>>> >>>> 1) "I agree my data will be processed" checkbox >>>> 2) "display agreement" button >>>> >>>> would it be OK? >>>> >>>> On Wed, Apr 25, 2018 at 6:16 PM, Maxim Solodovnik <[email protected] >>>> > wrote: >>>> >>>>> These errors seems to be caused by code changes after testing :( >>>>> I'll double-check it >>>>> >>>>> IP addresses are cleaned up by periodic job. >>>>> Will also add clean by purge >>>>> Thanks for checking! >>>>> >>>>> WBR, Maxim >>>>> (from mobile, sorry for the typos) >>>>> >>>>> On Wed, Apr 25, 2018, 17:33 Peter Dähn <[email protected]> wrote: >>>>> >>>>>> Hi Maxim, >>>>>> >>>>>> first test... >>>>>> >>>>>> purge confirmation dialogue should be different from delete... >>>>>> >>>>>> >>>>>> >>>>>> maybe "Do you really want to purge this item? This can't be undone!" >>>>>> Something like that... >>>>>> >>>>>> After purge I got an 500 internal error page... >>>>>> >>>>>> openmeetings.log: >>>>>> >>>>>> *ERROR 04-25 12:05:13.708 o.a.w.DefaultExceptionMapper:170 >>>>>> [nio-5080-exec-3] - Unexpected error occurred* >>>>>> *java.lang.NullPointerException: zoneId* >>>>>> * at java.util.Objects.requireNonNull(Objects.java:228)* >>>>>> * at java.time.ZoneId.of(ZoneId.java:311)* >>>>>> * at >>>>>> org.apache.openmeetings.util.CalendarHelper.getZoneId(CalendarHelper.java:30)* >>>>>> * at >>>>>> org.apache.openmeetings.util.CalendarHelper.getZoneDateTime(CalendarHelper.java:43)* >>>>>> * at >>>>>> org.apache.openmeetings.util.CalendarHelper.getDate(CalendarHelper.java:47)* >>>>>> * at org.apache.openmeetings.web.co >>>>>> <http://org.apache.openmeetings.web.co>mmon.GeneralUserForm.updateModelObject(GeneralUserForm.java:173)* >>>>>> * at org.apache.openmeetings.web.ad >>>>>> <http://org.apache.openmeetings.web.ad>min.users.UserForm.onModelChanged(UserForm.java:198)* >>>>>> * at org.apache.wicket.Component.mo >>>>>> <http://org.apache.wicket.Component.mo>delChanged(Component.java:2143)* >>>>>> * at org.apache.wicket.Component.se >>>>>> <http://org.apache.wicket.Component.se>tDefaultModelObject(Component.java:3026)* >>>>>> * at >>>>>> org.apache.wicket.IGenericComponent.setModelObject(IGenericComponent.java:81)* >>>>>> * at org.apache.openmeetings.web.ad >>>>>> <http://org.apache.openmeetings.web.ad>min.users.UserForm.updateForm(UserForm.java:266)* >>>>>> * at org.apache.openmeetings.web.ad >>>>>> <http://org.apache.openmeetings.web.ad>min.users.UserForm.purgeUser(UserForm.java:240)* >>>>>> * at org.apache.openmeetings.web.ad >>>>>> <http://org.apache.openmeetings.web.ad>min.users.UserForm.onPurgeSubmit(UserForm.java:214)* >>>>>> * at org.apache.openmeetings.web.ad >>>>>> <http://org.apache.openmeetings.web.ad>min.AdminBaseForm$1.onPurgeSubmit(AdminBaseForm.java:75)* >>>>>> * at org.apache.openmeetings.web.co >>>>>> <http://org.apache.openmeetings.web.co>mmon.FormActionsPanel$3.onSubmit(FormActionsPanel.java:93)* >>>>>> * at org.apache.openmeetings.web.co >>>>>> <http://org.apache.openmeetings.web.co>mmon.ConfirmableAjaxBorder.lambda$new$5f39bb3f$1(ConfirmableAjaxBorder.java:74)* >>>>>> * at org.apache.openmeetings.web.co >>>>>> <http://org.apache.openmeetings.web.co>mmon.ConfirmableAjaxBorder$ConfirmableBorderDialog.onSubmit(ConfirmableAjaxBorder.java:196)* >>>>>> * at >>>>>> com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog$DialogFormSubmitter.onSubmit(AbstractFormDialog.java:294)* >>>>>> * at >>>>>> org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1268)* >>>>>> * at >>>>>> org.apache.wicket.markup.html.form.Form.process(Form.java:963)* >>>>>> * at >>>>>> org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:787)* >>>>>> * at >>>>>> com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog.internalOnClick(AbstractFormDialog.java:215)* >>>>>> * at >>>>>> com.googlecode.wicket.jquery.ui.widget.dialog.AbstractDialog$1.onClick(AbstractDialog.java:413)* >>>>>> * at >>>>>> com.googlecode.wicket.jquery.ui.widget.dialog.DialogBehavior.onAjax(DialogBehavior.java:188)* >>>>>> * at com.googlecode.wicket.jquery.core.ajax.JQueryAjaxBehavior.re >>>>>> <http://ore.ajax.JQueryAjaxBehavior.re>spond(JQueryAjaxBehavior.java:173)* >>>>>> * at >>>>>> org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:598)* >>>>>> * at >>>>>> org.apache.wicket.core.request.handler.ListenerRequestHandler.internalInvoke(ListenerRequestHandler.java:306)* >>>>>> * at >>>>>> org.apache.wicket.core.request.handler.ListenerRequestHandler.invoke(ListenerRequestHandler.java:280)* >>>>>> * at >>>>>> org.apache.wicket.core.request.handler.ListenerRequestHandler.invokeListener(ListenerRequestHandler.java:222)* >>>>>> * at >>>>>> org.apache.wicket.core.request.handler.ListenerRequestHandler.respond(ListenerRequestHandler.java:208)* >>>>>> * at >>>>>> org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:912)* >>>>>> * at >>>>>> org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65)* >>>>>> * at >>>>>> org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283)* >>>>>> * at >>>>>> org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:253)* >>>>>> * at >>>>>> org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221)* >>>>>> * at org.apache.wicket.protocol.ws >>>>>> <http://org.apache.wicket.protocol.ws>.AbstractUpgradeFilter.processRequestCycle(AbstractUpgradeFilter.java:70)* >>>>>> * at >>>>>> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:204)* >>>>>> * at >>>>>> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:286)* >>>>>> * at >>>>>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)* >>>>>> * at >>>>>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)* >>>>>> * at >>>>>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)* >>>>>> * at >>>>>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)* >>>>>> * at >>>>>> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:611)* >>>>>> * at >>>>>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)* >>>>>> * at >>>>>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)* >>>>>> * at >>>>>> org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)* >>>>>> * at >>>>>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)* >>>>>> * at >>>>>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)* >>>>>> * at >>>>>> org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)* >>>>>> * at >>>>>> org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)* >>>>>> * at >>>>>> org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)* >>>>>> * at org.apache.tomcat.util.net >>>>>> <http://org.apache.tomcat.util.net>.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)* >>>>>> * at org.apache.tomcat.util.net >>>>>> <http://org.apache.tomcat.util.net>.SocketProcessorBase.run(SocketProcessorBase.java:49)* >>>>>> * at >>>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)* >>>>>> * at >>>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)* >>>>>> * at >>>>>> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)* >>>>>> * at java.lang.Thread.run(Thread.java:745)* >>>>>> >>>>>> this error is also shown after choosing a purged user. Set time_zone >>>>>> manually in db fixed it. >>>>>> time_zone seems to be deleted while purging and then it causes the >>>>>> error. >>>>>> >>>>>> om_user-table will be handled correctly. >>>>>> conference_log preserves the ip-address >>>>>> address-table preserves the address >>>>>> chat-table preserves from_name >>>>>> >>>>>> Did I miss something? >>>>>> >>>>>> >>>>>> Am 25.04.2018 um 09:00 schrieb Peter Dähn: >>>>>> >>>>>> Good morning Maxim, >>>>>> >>>>>> I was alone in the office these days... unfortunatly there were no >>>>>> time left... But I red right in the moment the RUNNING.txt... all a bit >>>>>> different... ;-) >>>>>> >>>>>> I'm going to text it now... give me a bit time... ;-) >>>>>> >>>>>> Am 25.04.2018 um 04:41 schrieb Maxim Solodovnik: >>>>>> >>>>>> Good morning Peter :) >>>>>> >>>>>> were you able to take a look at this issue? >>>>>> >>>>>> On Mon, Apr 23, 2018 at 2:37 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> Hi Maxim, >>>>>> >>>>>> I will have a look right now. >>>>>> >>>>>> Greetings Peter >>>>>> >>>>>> >>>>>> Am 21.04.2018 um 18:17 schrieb Maxim Solodovnik: >>>>>> >>>>>> Hello Peter, >>>>>> >>>>>> this is partially implemented >>>>>> Could you please test current implementation using latest nightly >>>>>> build? >>>>>> >>>>>> And maybe you can provide sample "personal data agreement" text? >>>>>> >>>>>> On Wed, Apr 11, 2018 at 6:38 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> I try... ;-) >>>>>> >>>>>> >>>>>> Am 11.04.2018 um 13:11 schrieb Maxim Solodovnik: >>>>>> >>>>>> Will write it as a requirement, will see what can be done here >>>>>> Thanks a lot for the quick answers! >>>>>> >>>>>> On Wed, Apr 11, 2018 at 5:34 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> ip-address is now a private date... it have to be at least anonymised >>>>>> after 7 (maybe 14 days)... ipv4 addresses delete last 8 recommended >>>>>> 16 >>>>>> bit >>>>>> (192.168.123.0 or 192.168.0.0) and ipv6 preserve first 48 -8 or >>>>>> better >>>>>> 16 >>>>>> Bit (2a00:1234:56:: or 2a00:1234::) Maybe this could be done >>>>>> automated >>>>>> after >>>>>> 7 Days? >>>>>> >>>>>> Greetings Peter >>>>>> >>>>>> Am 11.04.2018 um 09:31 schrieb Maxim Solodovnik: >>>>>> >>>>>> According "Hash algorithm" I planned to use random UUID >>>>>> so All fields will look like this: >>>>>> "Purged_54cd4426-1c0a-4ab8-bb35-eb6d26da99cf" >>>>>> >>>>>> Are you sure IP should be cleaned-up? There will be no chance to >>>>>> "restore" >>>>>> who was this user ..... >>>>>> >>>>>> On Wed, Apr 11, 2018 at 2:18 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> Hi Maxim, >>>>>> >>>>>> I think this list is complete and you are right, this is a lot of >>>>>> stuff. >>>>>> >>>>>> The option that you suggest sound much more feasible. From my point >>>>>> of >>>>>> few this should be enough. >>>>>> >>>>>> Hash algorithm need to be state of the art. IP-address in >>>>>> ConferenceLog >>>>>> need to be cleaned. >>>>>> >>>>>> I think this is a good way. >>>>>> >>>>>> Btw... is there is a way/setting to anonymize IP-adresses while >>>>>> logging? >>>>>> Otherwise I need to write a script to do so. Maybe I need to do it >>>>>> anyway to >>>>>> kick out usernames. Logfiles need to be delete after 7 (maybe 14) >>>>>> days >>>>>> or >>>>>> they need to be without any userdata. >>>>>> >>>>>> Greetings Peter >>>>>> >>>>>> >>>>>> Am 11.04.2018 um 06:43 schrieb Maxim Solodovnik: >>>>>> >>>>>> Hello Peter, >>>>>> >>>>>> Here is the high level list of what need to done to "hard delete" >>>>>> user >>>>>> from the system: >>>>>> >>>>>> delete user >>>>>> delete all user contacts (also users, so we might have recursion >>>>>> here) >>>>>> delete user from all groups >>>>>> delete user from room moderators >>>>>> delete all appointments with owner == user >>>>>> delete all calendars with owner == user >>>>>> delete all meeting members in appointments where owner != user >>>>>> delete all Private Messages where user is in to/from fields >>>>>> delete all UserContact + Requests >>>>>> delete all invitation sent by this user >>>>>> delete all private rooms owned by this user >>>>>> delete all user private files/recordings >>>>>> delete all chat messages send/received by this user >>>>>> clean email messages >>>>>> clean all Polls/answers >>>>>> >>>>>> >>>>>> This list scares me a lot :((( >>>>>> >>>>>> So let's discuss the option: "Mark user deleted and clean-up >>>>>> sensitive >>>>>> information" >>>>>> >>>>>> What I would propose: >>>>>> >>>>>> In Admin->User area >>>>>> >>>>>> display all users (deleted should be "read-only" with restore and >>>>>> purge >>>>>> options only) >>>>>> add additional "Purge" button >>>>>> In case Purge will be selected: >>>>>> >>>>>> User will be marked deleted >>>>>> AsteriskSipUser and Address will be replaced with empty objects >>>>>> User fields "age, externaluserid, firstname, lastname, login, >>>>>> pictureuri" >>>>>> will be replaced with "Purged_some_hash" >>>>>> User profile picture will be deleted >>>>>> ChatMessage: fromName will be replaced with "Purged User" >>>>>> MailMessage: should be purged (some search by email will be required) >>>>>> >>>>>> ConferenceLog right now contains userId+UserIp right now, so it is 2 >>>>>> numbers should it be cleaned up? >>>>>> >>>>>> SOAPLogin contains clientURL and doesn't contains userId, so it is >>>>>> impossible to associate SoapLogin object with particular user >>>>>> >>>>>> >>>>>> Would it be enough? >>>>>> >>>>>> >>>>>> On Fri, Apr 6, 2018 at 4:21 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> Hi Maxim, >>>>>> >>>>>> hard delete as only option would be the easiest way (for the admin). >>>>>> One >>>>>> doesn't need to remind "hard delete" at a given time... I think it >>>>>> need to >>>>>> be implemented anyway. I thought just the ones that doesn't need to >>>>>> take >>>>>> care about these regulation could keep things as they are now... >>>>>> >>>>>> Greetings Peter >>>>>> >>>>>> >>>>>> Am 06.04.2018 um 10:09 schrieb Maxim Solodovnik: >>>>>> >>>>>> I'm afraid there will be no option to "final delete one record" >>>>>> It will be: perform total clean-up and hard delete all soft deleted >>>>>> records >>>>>> >>>>>> Or better to perform: hard delete as the only option? >>>>>> >>>>>> On Fri, Apr 6, 2018 at 2:44 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> Hi Maxim, >>>>>> >>>>>> "soft" and "final delete" should be enough I think... >>>>>> >>>>>> It just need to be "findable" and described for new admins that >>>>>> provide the >>>>>> service in the EU... >>>>>> >>>>>> jira in a second... >>>>>> >>>>>> Greetings Peter >>>>>> >>>>>> >>>>>> Am 05.04.2018 um 17:47 schrieb Maxim Solodovnik: >>>>>> >>>>>> Hello Peter, >>>>>> >>>>>> This sounds like lots of new testing :( >>>>>> Will try to find time and include it in 4.0.3/4.0.4 >>>>>> >>>>>> (have very limited time right now :( ) >>>>>> Will appreciated any help with testing >>>>>> >>>>>> Would it be OK to perform "final delete" in clean-up widget? i.e. >>>>>> delete will be "soft delete", then in if will push "Clean-up" all >>>>>> soft >>>>>> deleted data will be hard deleted ... >>>>>> Or it doesn't worth to have both? only hard delete will be enough? >>>>>> >>>>>> On Thu, Apr 5, 2018 at 5:55 PM, Peter Dähn <[email protected]> >>>>>> <[email protected]> wrote: >>>>>> >>>>>> Hey there, >>>>>> >>>>>> new privacy regulations will take place on the 25th May 2018 in >>>>>> Europe. >>>>>> You >>>>>> could find informations about it by searching for General Data >>>>>> Protection >>>>>> Regulation (EU) 2016/679. >>>>>> >>>>>> To use openmeetings after the 25th of May (in Europe) there need >>>>>> to >>>>>> be a >>>>>> few >>>>>> changes. We use openmeetings integrated. So I will mainly be >>>>>> focused >>>>>> on >>>>>> the >>>>>> room. >>>>>> >>>>>> I have 3 points that are really necessary: >>>>>> >>>>>> 1. User deletion: Datasets of users that will be deleted need to >>>>>> be >>>>>> remove >>>>>> from the database, not just marked as deleted. Probably it is >>>>>> enough >>>>>> to >>>>>> hash >>>>>> those fields. >>>>>> >>>>>> I think critical fields are in table: >>>>>> >>>>>> om_user -> age, externaluserid, firstname, lastname, >>>>>> login, >>>>>> pictureuri (and picture itself) and sip_user_id >>>>>> >>>>>> conferencelog -> email, external_user_id, firstname, >>>>>> lastname, >>>>>> user_id, userip >>>>>> >>>>>> soaplogin -> client_url (contains the ip-address) >>>>>> >>>>>> sipusers (here empty so please check) -> >>>>>> defaultuser, >>>>>> host, >>>>>> ipaddr, name >>>>>> >>>>>> address -> email, fax, phone >>>>>> >>>>>> chat -> from_name >>>>>> >>>>>> e-mail_queue (if not empty) -> recipients, replyto >>>>>> >>>>>> 2. There need to be a place to place a (customized) privacy >>>>>> policy. >>>>>> >>>>>> 3. Registration-Dialog need to have a button/step to agree the >>>>>> data >>>>>> processing. And to this belongs a button to disagree. >>>>>> >>>>>> >>>>>> As far as I can see this need to be done in the first place. I'm >>>>>> sure >>>>>> there >>>>>> are more things to do. Maybe someone can complete it. >>>>>> >>>>>> >>>>>> Greetings Peter >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> WBR >>>>>> Maxim aka solomax >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> WBR >>>>>> Maxim aka solomax >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> WBR >>>>>> Maxim aka solomax >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>> >>>> >>>> -- >>>> WBR >>>> Maxim aka solomax >>>> >>>> >>> >>> >>> -- >>> WBR >>> Maxim aka solomax >>> >>> >> >> >> -- >> WBR >> Maxim aka solomax >> > > > > -- > Daniel Ascher, M.Ed. > President > A+ Test Prep and Tutoring > "Creating Bright Futures" > > 505 York Road, Suite 6 > <https://maps.google.com/?q=505+York+Road,+Suite+6+Jenkintown,+PA+19046+Office:%C2%A0+215&entry=gmail&source=g> > Jenkintown, PA 19046 > <https://maps.google.com/?q=505+York+Road,+Suite+6+Jenkintown,+PA+19046+Office:%C2%A0+215&entry=gmail&source=g> > Office: > <https://maps.google.com/?q=505+York+Road,+Suite+6+Jenkintown,+PA+19046+Office:%C2%A0+215&entry=gmail&source=g> > 215 > <https://maps.google.com/?q=505+York+Road,+Suite+6+Jenkintown,+PA+19046+Office:%C2%A0+215&entry=gmail&source=g> > .886.9188 > Direct: 267.242.9640 > Sign Up for A+ News and Test Prep Tips! > <http://www.aplustutoring.com/sign-up-for-a-news> > www.aplustutoring.com > -- WBR Maxim aka solomax
