1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @fileoverview A set of classes to support aural CSS. 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.provide('cvox.AuralProperty'); 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.provide('cvox.AuralStyleConverter'); 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.provide('cvox.AuralStyleUtil'); 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This seems the only way to lay out an enum and use it as a key. 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @enum {string} 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralProperty = { 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VOLUME: 'VOLUME', 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK: 'SPEAK', 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE_BEFORE: 'PAUSE_BEFORE', 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE_AFTER: 'PAUSE_AFTER', 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE: 'PAUSE', 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE_BEFORE: 'CUE_BEFORE', 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE_AFTER: 'CUE_AFTER', 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE: 'CUE', 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PLAY_DURING: 'PLAY_DURING', 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AZIMUTH: 'AZIMUTH', 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ELEVATION: 'ELEVATION', 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEECH_RATE: 'SPEECH_RATE', 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VOICE_FAMILY: 'VOICE_FAMILY', 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: 'PITCH', 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH_RANGE: 'PITCH_RANGE', 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) STRESS: 'STRESS', 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RICHNESS: 'RICHNESS', 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_PUNCTUATION: 'SPEAK_PUNCTUATION', 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_NUMERIAL: 'SPEAK_NUMERIAL', 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_HEADER: 'SPEAK_HEADER', 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NONE: 'NONE' 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/* A series of conversion functions. */ 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * An identity conversion. 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {number} value The aural CSS value to convert. 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @return {number} The resulting tts property value. 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleConverter.identity = function(value) { 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return value; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Conversion from an aural style property to Chrome TTS property. 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * TODO(dtseng): no-op's below need to be supported by the extension API itself 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * or by ChromeVox. 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @type {Object.<cvox.AuralProperty, string>} 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleConverter.propertyTable = { 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VOLUME: 'volume', 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK: 'no-op', 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE_BEFORE: 'no-op', 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE_AFTER: 'no-op', 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE: 'no-op', 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE_BEFORE: 'no-op', 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE_AFTER: 'no-op', 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE: 'no-op', 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PLAY_DURING: 'no-op', 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AZIMUTH: 'no-op', 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ELEVATION: 'no-op', 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEECH_RATE: 'relativeRate', 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VOICE_FAMILY: 'no-op', 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: 'relativePitch', 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH_RANGE: 'no-op', 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) STRESS: 'no-op', 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RICHNESS: 'no-op', 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_PUNCTUATION: 'no-op', 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_NUMERIAL: 'no-op', 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_HEADER: 'no-op', 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NONE: 'no-op' 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Conversion from an aural style value to Chrome TTS value. 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * TODO(dtseng): Conversion of aural CSS values is incomplete; everything is an 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * identity conversion at the moment. 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @type {Object.<cvox.AuralProperty, function(*)>} 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleConverter.valueTable = { 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VOLUME: cvox.AuralStyleConverter.identity, 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK: cvox.AuralStyleConverter.identity, 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE_BEFORE: cvox.AuralStyleConverter.identity, 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE_AFTER: cvox.AuralStyleConverter.identity, 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PAUSE: cvox.AuralStyleConverter.identity, 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE_BEFORE: cvox.AuralStyleConverter.identity, 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE_AFTER: cvox.AuralStyleConverter.identity, 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CUE: cvox.AuralStyleConverter.identity, 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PLAY_DURING: cvox.AuralStyleConverter.identity, 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AZIMUTH: cvox.AuralStyleConverter.identity, 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ELEVATION: cvox.AuralStyleConverter.identity, 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEECH_RATE: cvox.AuralStyleConverter.identity, 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VOICE_FAMILY: cvox.AuralStyleConverter.identity, 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: cvox.AuralStyleConverter.identity, 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH_RANGE: cvox.AuralStyleConverter.identity, 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) STRESS: cvox.AuralStyleConverter.identity, 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RICHNESS: cvox.AuralStyleConverter.identity, 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_PUNCTUATION: cvox.AuralStyleConverter.identity, 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_NUMERIAL: cvox.AuralStyleConverter.identity, 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SPEAK_HEADER: cvox.AuralStyleConverter.identity, 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NONE: cvox.AuralStyleConverter.identity 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Converts a given aural property/value rule to a tts property/value. 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {cvox.AuralProperty} property The property. 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {*} value The CSS-based value. 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @return {Object} An object holding tts property and value. 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleConverter.convertRule = function(property, value) { 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return { 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) property: cvox.AuralStyleConverter.propertyTable[property], 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) value: cvox.AuralStyleConverter.valueTable[property](value) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Converts an aural CSS style block to a TTS property object. 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {Object.<cvox.AuralProperty, *>} style The style. 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @return {Object} The tts property object. 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleConverter.convertStyle = function(style) { 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var ttsProperties = {}; 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (var property in style) { 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var ttsProperty = 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.AuralStyleConverter.convertRule(property, style[property]); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ttsProperties[ttsProperty.property] = ttsProperty.value; 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ttsProperties; 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Gets the aural style for a node. 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {Node} node The node. 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @return {Object} The aural style, converted to tts properties. 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)*/ 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleUtil.getStyleForNode = function(node) { 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var style = cvox.AuralStyleUtil.defaultStyles[node.tagName]; 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!style) { 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return null; 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return cvox.AuralStyleConverter.convertStyle(style); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * A list of default aural styles. 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.AuralStyleUtil.defaultStyles = { 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'ARTICLE': { 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'ASIDE': { 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'FOOTER': { 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'H1': { 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.3 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'H2': { 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.25 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'H3': { 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.2 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'H4': { 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.15 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'H5': { 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'H6': { 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.05 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'HEADER': { 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'HGROUP': { 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'MARK': { 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'NAV': { 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'SECTION': { 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }, 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'TIME': { 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PITCH: -0.1 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 210