aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
Commit message (Collapse)AuthorAgeFilesLines
...
* | Drop the "missing provider" warning from ShaderEffect.Gunnar Sletta2013-12-031-1/+0
| | | | | | | | | | | | Task-number: QTBUG-34676 Change-Id: I5f1c2f9ebe6048da5d5c1d1ea5e4799eacea3e8b Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* | Fix typo in debug defineGunnar Sletta2013-12-031-1/+1
| | | | | | | | | | Change-Id: I4d024aeb4618228cad3000ddfda32e5c8aba5742 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
* | Fix QQuickTextInput not overriding shortcuts (del/home...)Frederik Gladhorn2013-12-021-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | [ChangeLog][QtQuick] QQuickTextInput would not accept delete/home/backspace/left/right keys when the key was used in a shortcut. Task-number: QTBUG-34517 Change-Id: I553af8247191ecdadcb4677e9fc85848270a95d3 Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com> Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
* | Set all attached section properties before emitting change signals.Martin Jones2013-11-302-8/+23
| | | | | | | | | | | | | | | | | | | | If we have bindings to the section properties, e.g. implementing manual section header creation, we want previousSection, section and nextSection to be set before emitting the change signals to prevent different results each time the binding is run. Change-Id: Id3a0b4a53419681f35102c9e7c620b5c6112ebb0 Reviewed-by: Martin Jones <martin.jones@jollamobile.com>
* | When the MouseArea loses grab, an active drag should be cancelled.Robin Burchell2013-11-301-0/+6
| | | | | | | | | | Change-Id: Icc784dd3265c211d9b077b692464591a41976354 Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
* | Enable broken IBO fallback for Hisilicon Immersion 16 GPUEskil Abrahamsen Blomfeldt2013-11-291-0/+2
| | | | | | | | | | | | | | | | | | This GPU is on the Huawei Ascend D1 and exhibits crashes in glDrawElements() when rendering scenegraph when the workaround is not turned on. Change-Id: Ic601d34c01e34faaa091a631cfed74c3601c9c43 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
* | Set sampler precision in shifted distance field text shaderEskil Abrahamsen Blomfeldt2013-11-281-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | The precision would default to lowp and we would attempt to call smoothstep(mediump, mediump, lowp) which was a non-existent overload on some drivers, thus causing a compiler failure. We can use mediump for the sampler, like in the regular distance field shader. Task-number: QTBUG-35122 Change-Id: Ib50325d48fe7e0d25559da97e7f53e5170f705a1 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
* | Slightly accelerate access to value type propertiesSimon Hausmann2013-11-281-41/+41
| | | | | | | | | | | | | | | | | | | | | | We can't do a fast property index based access on them, due to the inability to read individual fields from the original object (i.e. the logic in QQmlValueTypeWrapper). However what we can determine and propagate is the type information of the individual properties, i.e. that the x and y properties of a QPointF are always doubles. Change-Id: Iee71ece2117294b7bc0b93deb0a77d7c51148b11 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* | TextInput: call fixup() when appropriateJ-P Nurmi2013-11-271-2/+2
| | | | | | | | | | | | | | | | | | | | [ChangeLog][QtQuick] Fixed TextInput to call fixup() on its validator when being accepted or losing focus, and the validator reports that the input is in "intermediate" state ie. the input should be fixed up. Task-number: QTBUG-35128 Change-Id: I4b15406c584a9647bcf892badfaf6d845868fbf1 Reviewed-by: Liang Qi <liang.qi@digia.com>
* | Delay renderWindow with a timerRobin Burchell2013-11-271-2/+6
| | | | | | | | | | | | | | | | | | | | Add an exhaust delay to QSGGuiThreadRenderLoop. Some updates may be done with posted events, and maybeUpdate event competed with those, leading to partial updates and frames drawn twice. Change-Id: I532bff692c597eeba5bbd6def89ae68c80fdd69b Done-with: Mikko Harju <mikko.harju@jollamobile.com> Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
* | Fix build with QT_NO_ACCESSIBILITYThomas McGuire2013-11-261-1/+1
| | | | | | | | | | | | | | "q" was an unused variable, which triggered a warning/error. Change-Id: I83bdc63a7caa12a5cd48331729492c0f36ed6fa0 Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
* | Merge branch 'release' of ssh://codereview.qt-project.org/qt/qtdeclarative ↵Simon Hausmann2013-11-2614-28/+84
|\| | | | | | | | | | | into stable Change-Id: I0bf06be69927d5961f1bdb4948c3572ef6111923
| * Use QFontDatabase to check if a font is scalable.Yoann Lopes2013-11-251-2/+5
| | | | | | | | | | | | | | | | | | The flag set in QFontEngine was not always correctly set, use QFontDatabase instead which is slower but should always be correct. We fallback to native font rendering when the font is not scalable. Change-Id: Ie9a2397abd42890d0fb05bc2f9c46a60040296f2 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
| * Stop render thread regardless when the window is being destroyedGunnar Sletta2013-11-251-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a window is shown and quickly hidden again we can get to a state, on a asynchronous windowing system API, where the isExposed=true event has been pushed to the event queue but not yet processed at the time the user calls hide(). As hide() immediately sets isVisible() to false, we end up with isExposed=true and isVisible=false which prevent the WM_Obscure event to be sent to render loop which means the render thread thought the window was still on screen when we reched the shutdown in WM_TryRelease. Changed WM_TryRelease handling to disregard window state when the window is being deleted. This forces SG and GL cleanup and stops the thread. Task-number: QTBUG-35055 Change-Id: Ibac5aa27354d6450f30a61450214cb785ab855bf Reviewed-by: J-P Nurmi <jpnurmi@digia.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * Fix rendering of Flipable content.Gunnar Sletta2013-11-251-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | When a batch is merged in the renderer, we use the z component to stack the item front to back. This works because each item is guaranteed to have a z-range of 0->1. However, when a projective matrix is used, we need to compensate for the implicit [x,y,z]/w, which GL applies to gl_Position after the vertex stage completes, so that this guarantee still holds. Task-number: QTBUG-35020 Change-Id: I254a3d4dc9ad22f53717160ec6ad8f3a27b43d1c Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * No assert when the focus changes and a window has no active focus item.Frederik Gladhorn2013-11-251-10/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [ChangeLog][QtQuick] Fix crash when showing and hiding a window that has no active focus item. QtQuickControls hit the situation where a popup window was shown without ever having an active focus item. When then closing the popup, clearFocusInScope would assume it had to always modify the old focus, but in this case the focus would be on the window itself, so there is nothing to update. Task-number: QTBUG-35057 Change-Id: Ifbde4689d39f98b13e6f90573cb22e28bb86f2c4 Reviewed-by: J-P Nurmi <jpnurmi@digia.com> Reviewed-by: Liang Qi <liang.qi@digia.com>
| * Do not crash when resizing invisible (non-tracked) windows.Gunnar Sletta2013-11-251-3/+4
| | | | | | | | | | Change-Id: I776c21a0f675d2dbe831325cef2c1c2a103e03e5 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
| * Be even more tolerant towards broken platform behavior.Gunnar Sletta2013-11-227-7/+25
| | | | | | | | | | | | | | | | | | | | When the platform (Mac in particular) sends us exposes for windows which are not renderable, we store it for later and fake expose events when we get resized. Task-number: QTCREATORBUG-10814 Change-Id: I909bb5a920550589322afd97ae1834884754cf81 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Safeguard the threaded renderloop against incorrectly exposed windows.Gunnar Sletta2013-11-221-6/+9
| | | | | | | | | | | | | | | | | | | | | | | | On Mac we had a situation where we got expose events for windows which were either 0x24 in size or completely off the screen. These would result in makeCurrent failing and lead to crashes later on in the scene graph. Safeguard against invalid dimensions during initialization and abort after a call to makeCurrent if any of them fail. Task-number: QTCREATORBUG-10814 Change-Id: I9063ea4d078eea3914666e4c155d141a1502e2ff Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
| * TextInput: add editingFinished signalLiang Qi2013-11-223-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Autotest is included. Task-number: QTBUG-34780 [ChangeLog][QtDeclarative][TextInput] add editingFinished signal Change-Id: Ib633daee67cd4e5f15739a6004adbe882ab3d3fc Reviewed-by: Lars Knoll <lars.knoll@digia.com> Reviewed-by: J-P Nurmi <jpnurmi@digia.com> Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com> Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com> Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
| * Enforce window rendering in sequence on llvmpipe.Gunnar Sletta2013-11-202-0/+13
| | | | | | | | | | | | | | | | | | | | | | When rendering multiple windows in parallel on llvmpipe we end up with crashes deep inside llvmpipe as multiple threads seem to access unprotected resources. Work around this bug by enforcing that scene graph rendering happens on one window at a time. Task-number: QTCREATORBUG-10666 Change-Id: I2f734e8f653b2a9b4108eb189280ab922581e2c0 Reviewed-by: Kai Koehne <kai.koehne@digia.com>
* | Also update viewport size when header/footer size changesRobin Burchell2013-11-261-0/+2
| | | | | | | | | | | | | | Task-number: QTBUG-24292 Change-Id: I8e7f5abe077b6e8d2ce6625dcf43a34a7260934e Done-with: Martin Jones <martin.jones@jollamobile.com> Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
* | QSmoothedAnimation: Don't set property if animation isn't runningRobin Burchell2013-11-251-0/+3
| | | | | | | | | | | | | | | | | | | | This could cause things to get "stuck" in the wrong state under some rather hard to reproduce conditions. Change-Id: Ied23d2bdfcfd0b197f4b28fed9c82ffd64e52ebf Done-with: Aaron Kennedy <aaron.kennedy@jollamobile.com> Done-with: Alan Alpert <416365416c@gmail.com> Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
* | Performance note about QQuickWindow::setColor vs top-level RectangleGunnar Sletta2013-11-251-0/+5
| | | | | | | | | | Change-Id: I58d271b108734958b6e0cd55ff62417d5b649a63 Reviewed-by: Jerome Pasion <jerome.pasion@digia.com>
* | Fix assert after giving focus to a disabled item.Andrew den Exter2013-11-221-6/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | If an item has focus stolen by another item remove activeFocus from it even if the item that gains focus doesn't gain activeFocus. Otherwise the focus tree will enter a state where an item that is not the subFocusItem of its focus scope has activeFocus which is invalid and will trigger an assert in QQuickWindowPrivate::clearFocusInScope(). Task-number: QTBUG-34779 Change-Id: I72408ec0e4fd9b05ef595147ef1ef95b6aed1c16 Reviewed-by: Alan Alpert <aalpert@blackberry.com>
* | Always check for dragging changed, not just when movement startsRobin Burchell2013-11-211-3/+3
| | | | | | | | | | | | | | | | | | Otherwise, if you flick and then start a new drag before the flick completes, dragging remains false. Change-Id: I9bbe20107317a6edf765c87d2e0afe3e9e2618e9 Done-with: Aaron Kennedy <aaron.kennedy@jollamobile.com> Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
* | Use the sharing context when grabbing a hidden QQuickWindow.Jocelyn Turcotte2013-11-201-0/+1
| | | | | | | | | | | | | | | | This allows QtWebEngine auto tests to grab the window's contents without having to show it. Change-Id: I5989a9815d0f69a7eff655f322c99d6051fc4d25 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
* | Merge remote-tracking branch 'origin/release' into stableFrederik Gladhorn2013-11-2068-192/+1443
|\| | | | | | | Change-Id: Id732233d56e8d1706f62ef7a153d4a471406c551
| * Fix bad refcounting for Context2D.drawImage with an image item source.Gunnar Sletta2013-11-201-1/+1
| | | | | | | | | | | | | | | | | | | | | | The pixmap we get from createPixmap is cached internally in the QQuickCanvasItem's cache so we need to refcount it properly. Using take would result in the refcount going to zero in this function which would cause a crash. Task-number: QTBUG-34714 Change-Id: I5f0e75a7117c53e4b89ac133ba7d161bc7b9053d Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Fix build on iOSTor Arne Vestbø2013-11-191-1/+1
| | | | | | | | | | | | | | Icccd542b8122c7bfa0e83 and Ia6e9f06dbb850 clashed. Change-Id: Iaea844c9955eb29104ee32660499a67cb7224cbf Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
| * Fix compiler warnings with mingw64.Erik Verbruggen2013-11-181-1/+1
| | | | | | | | | | | | | | Task-number: QTBUG-34152 Change-Id: Ibb93d1cac8c343a7ca34ce7d010f24fc56ba89df Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Make sure we clean up GL resources before we delete the GL context.Gunnar Sletta2013-11-182-0/+4
| | | | | | | | | | | | | | Task-number: QTBUG-34806 Change-Id: I5013baaff0ca86357292474976944c1a3056f219 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
| * Doc: Fixed list of animation types.Jerome Pasion2013-11-181-10/+1
| | | | | | | | | | | | | | | | | | -manually created list duplicates the generated list. -\generatelist{related} doesn't do anything for a regular \page. Task-number: QTBUG-33360 Change-Id: I0bf870c71d3985e232fa8c0d5ef7ad572f596e99 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Make use of GL_APPLE_texture_format_BGRA8888.Gunnar Sletta2013-11-182-0/+10
| | | | | | | | | | | | | | | | Texture uploads on iOS is extremly slow without it. Change-Id: Icccd542b8122c7bfa0e839c25e988d107bc17d2a Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com> Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
| * Don't assert in QQuickItem::updateLars Knoll2013-11-181-1/+6
| | | | | | | | | | | | | | | | | | | | | | The method can actually be called from QML, so we can not have an assert in that method. Instead simply return if the item has no contents Task-number: QTBUG-34060 Change-Id: Ib28ffa5c6c63fbec956abe25020010ed73a9cfa9 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com> Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
| * Fix lockup in creator.Gunnar Sletta2013-11-151-2/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | My previous fix to force expose when the render thread is inactive was not enough. We now lock down access to 'QSGRenderThread::window' so that it will always be set when the thread is in the "exposed" state and 0 when the thread is in the "obscured" state. This introduces another sync point in handleObscurity to protect the writing of window in the render thread. Task-number: QTCREATORBUG-10793 Change-Id: I1e1153189b3a3562705892b42625f88ef6329188 Reviewed-by: Ulf Hermann <ulf.hermann@digia.com> Reviewed-by: Kai Koehne <kai.koehne@digia.com>
| * Do not crash when one of group animation's children is nullJacek Całusiński2013-11-151-1/+2
| | | | | | | | | | | | | | | | | | Check if pointer to QQuickAbstractAnimation for which we are setting group is valid. Task-number: QTBUG-34851 Change-Id: Iecb549f080804fd9489f884911fa51892def05a5 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Deprecate logicalPixelDensityAlan Alpert2013-11-151-3/+10
| | | | | | | | | | | | | | | | | | | | | | It's just not working out in practice, and we don't want to confuse users with having to pick their flavor of pixel density. Task-number: QTBUG-34798 Change-Id: I552e479515a6f5249685844143601cb7449ccccc Reviewed-by: Jerome Pasion <jerome.pasion@digia.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com> Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
| * Doc: Fixed QtQuick.Window documentationJerome Pasion2013-11-152-34/+34
| | | | | | | | | | | | | | | | | | | | | | -fixed import statement in \qmlmodule and \inqmlmodule command. -Removed extra identifier in property documentation. Task-number: QTBUG-33360 Change-Id: I1e7ca5f418c327d42247ab4f4a11733c63d8c273 Reviewed-by: Alan Alpert <aalpert@blackberry.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Fix stacking order bug in the rendererGunnar Sletta2013-11-151-0/+7
| | | | | | | | | | | | | | | | | | | | Since we are sorting batches based on the zorder of the first element it is crucial that we don't continue adding to batches once an overlap with a compatible element is found. Task-number: QTBUG-34864 Change-Id: Ic2194c5c17bba0bc9874a14e8a69c81bff75bd1c Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
| * Don't dereference a null animationTemplateLars Knoll2013-11-141-1/+2
| | | | | | | | | | | | | | | | | | | | If the SpringAnimation gets used inside a Transition, the animationTemplate might get cleared, but updateCurrentTime() still gets called on the SpringAnimation after that. Task-number: QTBUG-34539 Change-Id: I1f27fdbfc594e6ff9a4343e45f7f4001964bb012 Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
| * Avoid deadlock in Qt CreatorGunnar Sletta2013-11-141-1/+15
| | | | | | | | | | | | Task-number: QTCREATORBUG-10699 Change-Id: Ia88df5ec4ea74fda6a0449aa739a9c6976fedb02 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
| * Improve internal debug statements.Gunnar Sletta2013-11-141-92/+79
| | | | | | | | | | | | | | | | Now that we have one thread per window it is useful to know which thread and window prints out the messages. Change-Id: I699eae180575fd3355551ebe0bfe6fd6ac8837c9 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
| * Adapt Qt Quick 2 renderer to work with OpenGL Core ProfileSean Harmer2013-11-1357-39/+1230
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The basic approach is to have the batched renderer create and bind a vertex array object if it detects we are using an OpenGL Core profile context. The VAO is bound for the duration of the QQ2 renderer's work cycle and unbound at the end so as to not interfere with any other VAO's a user may wish to use. All shaders have been copied and ported to be compliant with the GLSL 150 core specification which is the minimum for a Core profile context (OpenGL 3.2 Core). We are not using any newer features as yet so this will work anywhere we can get a Core profile context. The QSGShaderSourceBuilder class has been extended to resolve any requests for shaders to the same basefilename with "_core" appended prior to any file extension. This could be extended in the future to allow version, or GPU or platform specific shaders. The QSGShaderSourceBuilder has also been extended to allow it to insert #define definitions in the prologue of a shader. Any such definition is inserted: * After the last #extension directive (if any are found) * Otherwise after the #version directive (if found) * Otherwise at the start of the shader source This is required by the custom particle shaders which make extensive use of such #defines. In addition the mechanism used by the distance field glyph cache to extend the cache with new glyphs has been modified to work (and work more efficiently) when using a Core profile context. Rather than using a shader program and a buffer filling quad to blit the old texture into the new cache texture, we instead use the technique of framebuffer blitting. The existing fallback implementation using glTexSubImage2D() is still available if needed. The DECLARATIVE_EXAMPLE_MAIN macro has been extended to allow easy testing of any of the QtDeclarative examples with a core profile context. Just run the example with QT_QUICK_CORE_PROFILE=1 ./text for e.g. The only ones that may not work out of the box are those that provide GLSL shader source e.g. the customparticles or shader effect examples. These work fine if the shader source is adapted to GLSL 150 core. In the future it may be a good idea to expose some context property to QML that the user can use to determine what shader source variation to provide to Qt Quick. Along these lines it would also be very nice to allow the provision of shader source to ShaderEffect or CustomParticle from a separate source file just as we now do within Qt Quick. Task-number: QTBUG-32050 Change-Id: Ia6e9f06dbb8508af9ae03c6b60fb418b4cc9e41f Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Fix boundingbox calculation of rotated items.Gunnar Sletta2013-11-122-8/+34
| | | | | | | | | | | | | | Task-number: QTBUG-34328 Change-Id: If0202a67d95500333a0fb6f4ca3eb19ecb027770 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
| * Fix Canvas2d.createConicalGradientLars Knoll2013-11-121-1/+1
| | | | | | | | | | | | | | | | The method requires 3 arguments, not 6 Task-number: QTBUG-34718 Change-Id: Ib6c117ba18844acecea3707720c0c88449b50fb6 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
* | Safely abort when we don't succeed in creating a GL context.Gunnar Sletta2013-11-192-3/+11
| | | | | | | | | | | | | | Task-number: QTBUG-33363 Change-Id: Ia2b0c329157786cb4ec703989f12d2fdb1ce6bc8 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* | Add support for quaternion in ShaderEffectGunnar Sletta2013-11-142-0/+7
|/ | | | | | Task-number: QTBUG-32605 Change-Id: I4e90a3505740dd9a8b369dac6ce05ce066d14d44 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Implement missing compare() function for Raised/Sunken textGunnar Sletta2013-11-112-0/+8
| | | | | | | Task-number: QTBUG-34715 Change-Id: Ifdac2511b7f642b1ea4bd06847c840b5a951a753 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
* Animate when only one out of several windows is exposed.Gunnar Sletta2013-11-111-3/+9
| | | | | | Change-Id: I7f76ed722f91076ee308a47c699984d371a220f0 Reviewed-by: Bernd Weimer <bweimer@blackberry.com> Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>