- From: Dael Jackson <daelcss@gmail.com>
- Date: Wed, 15 Oct 2014 14:10:22 -0400
- To: www-style@w3.org
Animations ---------- - sgalineau outlined the remaining issue about how to resolve properties that depend on a value from a different property. The options for the behavior were outlined in an e-mail from dbaron available here: http://lists.w3.org/Archives/Public/www-style/2014Aug/0132.html - All the options were evaluated and the group originally leaned toward option D. - There was a lot of testing done to determine which behavior browsers currently use and there was no clear winner. - Eventually it was concluded that the optimal behavior was option G (Base values are interpolated values from all animations on this element and on all elements on which its computed values depend) with the beta variant( Base values are dynamic (i.e., if the expected value at a future time changes the running animation changes to match)). - RESOLVED: Use Option G Beta - RESOLVED: Animations and Transitions both really do have the behavior that non-interpolable properties switch at 50% of the timing function. - TabAtkins will write an e-mail summarizing the proposal phasing out current requirements for snapshotting some events. - RESOLVED: When animation-duration:0s, start/end events fire with 0 elapsedTime - RESOLVED: Iteration events only fire for iterations that are actually run e.g. those not 'absorbed' by a negative delay. - Pause events were discussed and had a lot of interest, but were deferred to level 2 in order not to delay Animations level 1. ===== FULL MINUTES BELOW ====== Scribe: dauwhe Animations ---------- <sgalineau> http://lists.w3.org/Archives/Public/www-style/2014Aug/0132.html [Options from the e-mail: A: Base values are static values only. B: Base values are static values plus other values in same keyframe rule. C: Base values are static values plus other values in all keyframe rules in this @keyframes rule at same time. D: Base values are static values plus interpolated values from this @keyframes rule. E: Base values are static values at animation start time plus interpolated values from animations underneath this one (in cascading order) and this one, on the element to which this animation applies F: Base values are static values inherited from other elements at animation start time plus interpolated values from all animations, both under and over this one, on this element G: Base values are interpolated values from all animations on this element and on all elements on which its computed values depend] [E, F, and G also had related alpha and beta options, they are: alpha: Base values are static (i.e., chosen based on the animations known to apply at a certain future time when this animation is started) beta: Base values are dynamic (i.e., if the expected value at a future time changes the running animation changes to match)] sgalineau: Following up on telecon discussion - sgalineau: The basic story: we need to resolve how properties that depend on value of other property get resolved sgalineau: The height in ems depends on font size. sgalineau: There's an email from dbaon (link above) with possible scenarios. sgalineau: A. multiple animations depending on each other. sgalineau: At some point it gets really complex. sgalineau: I did some basic testing. sgalineau: You can depend on [A] across browsers, sgalineau: After that, there's no interoperability. sgalineau: [B] doesn't work. sgalineau: Two @keyframe rules with same selector, the last one wins. sgalineau: IE does [D] and [E], but it's not super smooth. sgalineau: A is all we have today. sgalineau: The same @keyframe rules should be like others in the system. sgalineau: I'm not finding evidence that people are bothered by the others not working. sgalineau: So, for level one we should resolve on a simple subset. sgalineau: A is the minimum we have today. sgalineau: B should work once people apply cascading across @keyframe rules. sgalineau: We can keep it simple. sgalineau: Some people do split animations across 2 or more @keyframe rules, sgalineau: But it's not common. astearns: One issue is dbaron just walked into the room so he missed the intro. * dbaron returns to the meeting room shans: looking at dbaron's post, C seems wrong. TabAtkins: That's a bad behavior. shans: Its bad to apply property changes in the future. shans: Seems strange to apply property values from the future in the present. sgalineau: Does it refer to 50%? TabAtkins: The keyframe updates the values that other keyframes will set. TabAtkins: If there was a 50% text size will resolve against ??? <TabAtkins> If there was a 50% keyframe that set font-size, the "1em" in text-indent would resolve against that; since there isn't, it resolves against the base value. sgalineau: Only A works today across browsers. sgalineau: Thus it's hard to find people running into issues due to b, c, d not working. sgalineau: So to keep simple in level one, just use A sgalineau: So let's not go there today. dbaron: I think gecko does B since you cascade across keyframe rules. dbaron: I can't tell the difference between b and c in other browsers. sgalineau: Beyond that we can punt to future levels. shans: Did you test chrome? sgalineau: I did, it did A, If it did other stuff it was not very pretty. sgalineau: My tests were on font size. shans: I think we intended to implement D sgalineau: It may have but it's so not smooth you couldn't use it. sgalineau: If the animations property depends on other things, resolve that, but don't go further. Don't resolve across animations. sgalineau: Questions? TabAtkins: I think D is great idea. sgalineau: You have animations depend on each other. dbaron: In our code there's implicit dependence. Would need to store data explicitly to do D. TabAtkins: How do you do it? dbaron: We compute properties lazily in groups. dbaron: The cross-structure dependencies are implicit. TabAtkins: I'm not sure why this is...? dbaron: We need to build a list of what the properties depend on; dbaron: In order to make sure there are no cycles. sgalineau: I think D is interesting because people split animation into multiple keyframe rules. sgalineau: Styling in one, motion in another. sgalineau: It already has cross-dependencies. sgalineau: Finding problems around this is hard. sgalineau: If there are implementation concerns, it's really not a problem today. TabAtkins: Since people have hacked around the problem. dbaron: This tends to show up in properties people don't animate much. clilley: Is that cause or effect? dbaron: Lea ran into the problem with animating border-width. sgalineau: I haven't really seen more bugs than Lea's. dbaron: It's not massively hard, just have to build and maintain list of dependencies. shans: It would be hard to go back to A. shans: Because of how property resolution gets done. TabAtkins: We'd have to maintain un-animated properties separately. sgalineau: Okay, I hear were going towards D. sgalineau: Are we doing E too? dbaron: E would be harder for us. shans: Us too. shans: We don't order animations. plinss: is there an order that makes more sense for authors? dbaron: G beta, but it's really hard--do what I meant! TabAtkins: G beta is not realistic. TabAtkins: D is a reasonable compromise. sgalineau: D and E? TabAtkins: E is not the same thing. It requires remembering animation orders. TabAtkins: Rather just normal property orders. dbaron: This message might be confusing- dbaron: A list from A to G but also a list of the changes between items. dbaron: In D you're considering each animation separately, dbaron: In E you're considering all of them underneath it in the cascade. astearns: Does that change the results you're reporting about E? sgalineau: Yes, I don't think I was testing E properly. CLilley: What was that? sgalineau: astearns was asking if my misunderstanding of D vs E affected my results, sgalineau: I think so. sgalineau: Do we have agreement that D is what we want? TabAtkins: Right now, we think we do F in chrome. shans: But we might change our mind. TabAtkins: We don't do E, I'm sure of that, TabAtkins: E requires caring about ordering. TabAtkins: F applies everything together in the appropriate way. shans: You resolve style for element, then apply. dbaron: What's weird about E and higher is that you don't know... dbaron: E, F, and G all have alpha and beta options. shans: Can we come back after we test? dbaron: Part of what I dislike about them is that both alpha and beta are bad in confusing ways. dbaron: The difference between alpha and beta, with alpha you figure out the animation first, then run it. dbaron: With F alpha if you apply a 2nd animation to something that's already running, you need to include a future point of the animation. dbaron: If you're repeating it's not clear what to do. dbaron: Beta is doing it dynamically. dbaron: You might have a repeating value with 2 values oscillating, dbaron: And what you're getting might change as that value changes. krit: In SVG, you have to use dynamic... dbaron: Does the same thing happen in SVG if you're animating font size? dbaron: So SVG animations are doing beta. dbaron: I remember agreeing that something else was static, but not base values. krit: Keeping the base value is static is easier. krit: This was one of the huge issues with performance. dbaron: You're recomputing the whole thing every tick? krit: Yep. plinss: That seems more rational from the author perspective. plinss: If author sees their animation doesn't perform, they will change it. sgalineau: What's the value if it's not performance? krit: I'm okay with beta later, but not as the default. dbaron: Only with E, F, or G are you computing other animations with base value of other animations. shans: What's the expected value? TabAtkins: We're doing F alpha. TabAtkins: We do have them interact, but only based on the static value of the other animation. TabAtkins: Never mind TabAtkins: I think it's D. plinss: Authors want G beta. plinss: If that what they want to have, plinss: Are we blocking the future? sgalineau: If we agree on D, we can do more in future. sgalineau: How does doing D now and E/F/G later break all animations? TabAtkins: If you change from D to G beta you'll change the example. sgalineau: Shit. * sgalineau ^ technical term plinss: I'm loathe to prevent some hypothetical future version from doing this right. plinss: We always find a way to do it faster in future. krit: And SVG has been doing it for years. plinss: We've had no complaints about performance and we have interoperability. plinss: Should we leave this undefined for now? clilley: That's worse than anything else. clilley: Different implementations will do different things. clilley: One will do something different, that will become the new standard. shans: It's hard to tell what we're doing plinss: We should define this to break for now, explicitly have it not work. Dependent animation just won't work. dbaron: No. It's a breaking change. dbaron: Alpha and beta are only options for E, F, and G, we're implementing B. <TabAtkins> hober: http://software.hixie.ch/utilities/js/live-dom-viewer/saved/3160 <TabAtkins> hober: http://software.hixie.ch/utilities/js/live-dom-viewer/saved/3161 various: murmuring sgalineau: It's the same in Chrome and Firefox. TabAtkins: We're doing D and not anything higher than D. TabAtkins: They are interacting if you're going from 10 to 300 on width in Blink and Safari. TabAtkins: If they're not interacting, then it goes from 10 to 50. TabAtkins: If they are, then goes from 20 to 300. sgalineau: Yes. sgalineau: Looks fine in Firefox. TabAtkins: In some cases Firefox implicitly does D. TabAtkins: If you run 3161 in Firefox they do interact. dbaron: No, two properties in the same keyframe rule is the A vs B distinction. [Everyone is testing browsers] sgalineau: Do we want to send this back to list? TabAtkins: No. We'll figure this out. plinss: We're on a mission. <dbaron> http://dbaron.org/css/test/2014/ sgalineau: We're back to A as the one you depend on. dbaron: They are a set of different behavior choices. dbaron: Both Chrome and Firefox are doing B, dbaron: You have to run the sequence. TabAtkins: We think we're in B only because of a bug. We should be in D. dbaron: This is computing base values. TabAtkins: We should be in F. shans: What's going on is we're pre-computing what the keyframes will be. dbaron: Everyone pre-computes what they are, dbaron: Not pre-computing would be beta option for E, F, and G. shans: Our engine is capable of not pre-computing, but we do the pre-computing to match previous behavior. TabAtkins: We recently rewrote all this code. TabAtkins: Let's change to not pre-computing, so then we'd be in F beta. krit: If you have transform with lots of values it would fall out of compositing mode all the time. TabAtkins: Possibly. dbaron: Do you know what IE does? gregwhitworth: We believe we do D * sgalineau got E wrong but believes IE did D dbaron: Will margin left work? gregwhitworth: Switching to margin since there's a bug on test indent. dbaron: I expected to go from 0 to 10 or 30 then back to 0. hober: We're doing C or lower. gregwhitworth: We're D or higher. hober: What do expect for EF? dbaron: Don't load yet. CLilley: Test-based spec editing! [more testing in progress] dbaron: G is a weird case. dbaron: Gecko does B + G. dbaron: It does consider ancestors. TabAtkins: Our web animation code does F beta. TabAtkins: We bug-fixed our CSS code to get B. TabAtkins: If we remove that we'll get F beta. TabAtkins: Don't use EMS in your transform functions. krit: If you do beta and you won't have that problem. krit: You added a performance regression? shans: We added a correctness enhancement. shans: Long-term we want to support it. krit: It makes sense for uniting CSS animation with SVG animation. dbaron: We do use values from ancestors. andrey: prefix removed? hober: Our result for FG is 0 to 10 and back to 0 dbaron: Gecko is going to 20 or 25 which is inexplicable. gregwhitworth: IE goes to 25 krit: IE is doing F? dbaron: G krit: what about Firefox? dbaron: B krit: What did you intend? TabAtkins: The difference between F and G if they interact it's G, TabAtkins: So we're doing that. dbaron: We're doing B + G. shans: We're animating before computing. hober: I'm retrying F + G, we seem to go to 20-25. dbaron: Just like Firefox. dbaron: This makes animations more different from transitions. dbaron: You just animate from an old computed value to a new computed value. dbaron: We implemented animation as an extension of transitions. dbaron: If we do this the other way, it's more like you're recomputing the value rather than figuring out the animation. plinss: Are we closer to decision? dbaron: Which other stuff does this depend on? dbaron: Do you figure all this out at the start, or as the animation runs? shans: Does a keyframe rule specify a set of values that change over time? shans: or a ??? plinss: Are we any closer to answer? shans: IE does G shans: Chrome core engine does G. florian: What if B + C test is the only wrong test? That's what presto does, and it overshoots a bit, dbaron: You're probably using a future keyframe. florian: It also overshoots D + E. gregwhitworth: B + C is not interoperable across browsers. gregwhitworth: IE and chrome keep font at initial size, Firefox resizes. dbaron: Some tests depend on cascading keyframes hober: On b + c we go from 0 to 10, dbaron: It's not meaningful if you don't cascade keyframes. dbaron: What does webkit do on C + D? hober: From 0 to 10 and back dbaron: Webkit does b or c. dbaron: We're not adding new info from testing. Let's figure out what we want. florian: We've proved going to G is doable. dbaron: Is this g beta? Rossen: For us it's g beta. dbaron: Does it bounce to 30 pixels each time? You're doing EFG/alpha dbaron: If it bounces bigger each bounce, then it's beta. plinss: IE is G Beta. Bert: Does this defeat the purpose? dbaron: Presto is just doing the destination value. Bert: If everything is dynamic you can't pre-compute, Bert: Then you can't optimize. Bert: If a computer isn't fast enough, you may want to drop frames. Rossen: Or just use a stylesheet that doesn't do this. shans: This isn't the slow part Bert: Say you're scaling an image, you might want to pre-compute all images. Bert: Even the smallest computer can then keep up. TabAtkins: You probably don't ever want to do that; it would eat up a ton of memory storing the temporary images. TabAtkins: Our core implementation does G beta. plinss: I hear us gravitating towards G beta. plinss: It's consistent with SVG, we have implementation proof. plinss: Any objections? RESOLVED: Use G Beta. sgalineau: Values that don't interpolate. sgalineau: There was confusion- we wanted to make them switch at 50% progress point. sgalineau: You'd switch from one to the other. sgalineau: I thought that would be true for transitions and animations, sgalineau: but dbaron said no. sgalineau: We still want to animate non-interpolated values at 50%, and only for animations, not transitions. TabAtkins: We don't want different behavior for animations and transitions. TabAtkins: It's okay to have initial value of transition to only those that can be smartly interpolated. dbaron: It can be a different in when you start CSS transitions. dbaron: The other issue is that I'm still worried about shorthands in the transition property value. dbaron: transition: font dbaron: Today that means you're transitioning font size and weight and nothing else. dbaron: Maybe this isn't too important, dbaron: It's a bigger deal for border. TabAtkins: Border will work better. dbaron: I'm worried about this change for compatibility. dbaron: Nobody has edited or implemented this. sgalineau: I was waiting. krit: Is there a problem if there's a difference between CSS and SVG? shans: Do you copy into animation before sending it down? I don't think it's an issue. shans: You should do what seems most useful. dbaron: The original transition spec had funny rule for visibility. dbaron: There are similar things with display or other things. dbaron: I can see it being useful but worried about the compatibility risk. TabAtkins: You're not worried about shorthand compatibility risk? dbaron: I'm worried about it all. TabAtkins: We can fix initial value problem, TabAtkins: Or changing all to mean not all of them. <sgalineau> Today 'all' really means all properties for those values that interpolate so we could also just keep it that way. krit: If you want to switch key values between key frames is that possible? dbaron: Is it possible with animations? dbaron: Is this animations only or animations and transitions? <gregwhitworth> http://lists.w3.org/Archives/Public/www-style/2011Apr/0079.html dbaron: This is more like the previous issue. dbaron: I didn't think that's (the link) the issue we are discussing. TabAtkins: We were discussing the general issue because it hasn't shown up in spec. dbaron: This is a different issue. <sgalineau> The issue gregwhitworth linked to is next for discussion. krit: So webkit switches immediately. krit: No transition is applied. sgalineau: There's another thing: when you do switch, whether duration gets involved. krit: It's better not to define the ideal, but to be interoperable. krit: Mostly. dbaron: I think the plan is that duration would be involved. dbaron: It would switch when the timing function crossed 50%. krit: This is not what SVG animations do. krit: SVG switches at 50% of the time rather than 50% of timing function. TabAtkins: We did discuss making non-interpolatable work only if the timing function was in steps. TabAtkins: In most animations they would not animate. dbaron: And there would have to be only one step. TabAtkins: There will be a step mid-function in level 2. CLilley: People didn't want it, something had to be defined to happen. krit: What do we gain from that? We can still do that with animation triggered by a transition. dbaron: The gain is with display. TabAtkins: Or border style. TabAtkins: Display is a big one. krit: It wasn't really used in SVG a lot, don't expect it to be used in CSS much. dbaron: I've seen people want it for display. TabAtkins: People want to do visibility, we've special-cased it. dbaron: I don't have strong opinion. dbaron: Except when whoever implements first should know we might have to change. dbaron: I guess I'm okay changing the resolution to be for transitions. TabAtkins: It might be backing down to just steps. dbaron: Or to just for transitions. sgalineau: We have resolution for css transitions. RESOLVED: Animations and Transitions both really do have the behavior that non-interpolable properties switch at 50% of the timing function. <sgalineau> http://lists.w3.org/Archives/Public/www-style/2011Apr/0079.html sgalineau: In the initial animation spec it requires snapshotting. sgalineau: Changes to your keyframe rules have no effect, it doesn't care what's going on. sgalineau: An issue that was raised is that's not something we want to do. sgalineau: We would allow animation property to change dynamically. sgalineau: We never concluded on what that means and how it works. <sgalineau> in particular http://lists.w3.org/Archives/Public/www-style/2011Apr/0352.html TabAtkins: The start time stays constant but everything else is adjustable. sgalineau: We don't want to double-fire start events, sgalineau: Or is that just a consistency issue? Bert: You can change the past? dbaron: What is the particular issue? sgalineau: The spec requires snapshotting, sgalineau: We don't want that. dbaron: I though we had a resolution on what replaced it. sgalineau: It's possible. TabAtkins: We appear to snapshot now. dbaron: Let me look at the minutes... <dbaron> http://lists.w3.org/Archives/Public/www-style/2012Nov/0261.html dbaron: That one does say details TBD. sgalineau: The issue is resolving the TBD. sgalineau: You mentioned that gecko the model accepts changes other than animation delay. dbaron: The model is that we compute a start time and then let you change everything else. dbaron: We may honor a dynamic change to animation delay. TabAtkins: Before the delay, it's the moment the animation starts applying, which is not controllable. dbaron: Yes. TabAtkins: When I hover over the test case, no longer speeds up in chrome. dbaron: It still speeds up in safari? hober: Yes. <hober> Rossen: http://software.hixie.ch/utilities/js/live-dom-viewer/?saved=3163 dbaron: There is now a list of resolutions to editors in the spec. sgalineau: Most of them are in. dbaron: What are the questions about what we should have? TabAtkins: What is adjustable? TabAtkins: Do you fire a 2nd start event? TabAtkins: What about at the end? sgalineau: You can change keyframes that haven't run. dbaron: I think the hard part is events stuff. dbaron: You compute things as if animation started when it started, and always have those values. TabAtkins: I agree, events is the hard part. dbaron: I expect Brian Birtles would have strong opinions about when events should fire. TabAtkins: Should we declare everything is touchable and ask Brian about event firing? dbaron: There may be some value in not re-firing at start and end. TabAtkins: What if you're past the end? Do you fire the end? TabAtkins: If you adjust the delay to a large negative value, do you fire the end event even though it didn't end, but changed from running to not running? dbaron: Brian recently rewrote this code 'cause he thought it was wrong. Bert: Even without dynamic, what if there's a huge negative delay? TabAtkins: That's defined. Bert: Does it have a start? TabAtkins: Yes. It started before you started... <sgalineau> So if you change animation-delay after the animation started running, making the delay larger has no effect. But if we make the delay negative, can we fast-forward or is it also ignored? CLilley: If you go into a video after an hour, and you missed lots of events... dbaron: There are lots of fun questions. Duration zero and iteration... TabAtkins: We decided not to fire an infinite number of animation events. dbaron: I'd say you only start once and only end once. TabAtkins: By iteration boundary, just fire an event whenever you pass through. TabAtkins: You usually don't care which iteration. TabAtkins: So you're not worried about duplication, missing ones, etc. dbaron: And we shouldn't try to file a pile of iteration events or skip iteration events because of duration/etc. changes. sgalineau: We didn't resolve animation delay issue, if you make it bigger is there no effect, sgalineau: Or do you fast-forward? TabAtkins: The delay should get adjusted. TabAtkins: The delay is just a component of its progress, no reason to special case. dbaron: Should someone write up for www-style? TabAtkins: I can do it. ACTION: TabAtkins to write up proposal for www-style <trackbot> Created ACTION-636 <sgalineau> http://lists.w3.org/Archives/Public/www-style/2014Sep/0056.html sgalineau: Let's talk about Brian's email. sgalineau: He had three options sgalineau: What happens visibly? sgalineau: And what in terms of events? dbaron: I think TabAtkins and I had the same preference on this. TabAtkins: A TabAtkins: B has its arguments. A is better on limiting behavior. TabAtkins: I don't know what we implement. sgalineau: Regardless of ??? dbaron: If you iteration count infinite and duration zero, you should act as if iteration count zero TabAtkins: Or in any finite value. TabAtkins: One disadvantage is showing rounding behavior. dbaron: That doesn't involve any iteration events. sgalineau: So it's like a zero-second animation with finite iteration count. RESOLVED: When animation-duration:0s, start/end events fire with 0 elapsedTime <sgalineau> http://lists.w3.org/Archives/Public/www-style/2014Aug/0393.html sgalineau: Interaction of negative delay, browsers do the right thing. sgalineau: Another question is what happens to events. sgalineau: I can't remember what Brian proposed. sgalineau: If you have a delay that is the negative of your duration, that one should not fire events. sgalineau: Otherwise, I think if your negative animation delay is larger than one iteration, you just swallow the iteration. TabAtkins: Both resolutions sound reasonable. sgalineau: #1, no start and end events are fired. sgalineau: If you have more than one iteration, and delay is larger than iteration, then don't fire any events. sgalineau: In the +5 -5 case, he says events should not fire. TabAtkins: He's just looking for consistency. TabAtkins: But if you don't fire events for things that start and end in the past, then you not fire in that case. TabAtkins: Which would be consistent with how we handle changing a delay in the middle of an animation. <dbaron> http://lists.w3.org/Archives/Public/www-style/2014Sep/thread.html#msg55 sgalineau: Start and end will fire, but no iteration events fire, and no iterations occurs. TabAtkins: Iteration events fire whenever you play through an iteration boundary. TabAtkins: But start and end always fire. sgalineau: That makes sense. TabAtkins: That's consistent with the infinite case, too. RESOLVED: Iteration events only fire for iterations that are actually run e.g. those not 'absorbed' by a negative delay Bert: In example B, the values are simplified, Bert: Just like 360 degrees simplify to 0. TabAtkins: What email are looking at? Bert: 393 dbaron: Must be from August. TabAtkins: It's not really simplifying, it's in the past so we're not firing events. Bert: The effect is the same. TabAtkins: Your explanation doesn't extend to other situations. Bert: How can I explain this to the user? TabAtkins: The animation never experienced the first iteration. sgalineau: If your animation is applied in a paused state, does the start event fire when paused? TabAtkins: I don't know. shans: I think we disagree, I think it should fire right away, Sylavin thinks it should fire when unpaused TabAtkins: We are clearly inside the animations progress, so it should fire. plinss: Any time we fire a start, we should fire an end. sgalineau: The confusion is that all start tells you is that it applied, not that it's running. TabAtkins: You can't tell about pauses from start events. shans: Pause events are a good idea. TabAtkins: If you're trying to manually sync with animation, then you need to know. TabAtkins: You'd have a start event then pause. plinss: You can't pause before you start. TabAtkins: Assuming pause events give you time, it should be zero in case it's paused at start. sgalineau: Should we add pause event to level one? TabAtkins: I don't have an opinion. plinss: I don't want to delay REC. TabAtkins: We could add it quickly. shans: We can delay. TabAtkins: I'm okay with that <glazou> <adjourn> fantasai: Does anyone have objection to display module using new process? dbaron: Let's save that for tomorrow, so we can resolve to move everything to move process. fantasai: Just want to make sure nobody objects, since it's already in the pipeline to be published on Thursday.
Received on Wednesday, 15 October 2014 18:10:50 UTC