~ubuntu-branches/debian/squeeze/glib2.0/squeeze

« back to all changes in this revision

Viewing changes to docs/reference/gobject/html/gobject-properties.html

  • Committer: Bazaar Package Importer
  • Author(s): Gustavo Noronha Silva
  • Date: 2009-02-15 13:00:43 UTC
  • mfrom: (1.3.1 upstream) (69.1.10 intrepid)
  • Revision ID: james.westby@ubuntu.com-20090215130043-q47fbt3owmt42m2f
Tags: 2.18.4-2
* Release to unstable
* debian/rules:
- bump SHVER, since we are already forcing a 2.18.0 dependecy on the
  symbols introduced in the development versions
* debian/control.in:
- added Homepage and Vcs-* control fields

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
2
<html>
3
3
<head>
4
 
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 
4
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5
5
<title>Object properties</title>
6
 
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2">
7
 
<link rel="start" href="index.html" title="GObject Reference Manual">
 
6
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
 
7
<link rel="home" href="index.html" title="GObject Reference Manual">
8
8
<link rel="up" href="chapter-gobject.html" title="The GObject base class">
9
9
<link rel="prev" href="gobject-memory.html" title="Object memory management">
10
10
<link rel="next" href="chapter-signal.html" title="The GObject messaging system">
11
 
<meta name="generator" content="GTK-Doc V1.9 (XML mode)">
 
11
<meta name="generator" content="GTK-Doc V1.11 (XML mode)">
12
12
<link rel="stylesheet" href="style.css" type="text/css">
13
13
<link rel="preface" href="pr01.html" title="Introduction">
14
 
<link rel="part" href="pt01.html" title="Part&#160;I.&#160;Concepts">
 
14
<link rel="part" href="pt01.html" title="Part I. Concepts">
15
15
<link rel="chapter" href="chapter-intro.html" title="Background">
16
16
<link rel="chapter" href="chapter-gtype.html" title="The GLib Dynamic Type System">
17
17
<link rel="chapter" href="chapter-gobject.html" title="The GObject base class">
18
18
<link rel="chapter" href="chapter-signal.html" title="The GObject messaging system">
19
19
<link rel="reference" href="rn01.html" title="API Reference">
20
20
<link rel="reference" href="rn02.html" title="Tools Reference">
21
 
<link rel="part" href="pt02.html" title="Part&#160;IV.&#160;Tutorial">
 
21
<link rel="part" href="pt02.html" title="Part IV. Tutorial">
22
22
<link rel="chapter" href="howto-gobject.html" title="How to define and implement a new GObject">
23
23
<link rel="chapter" href="howto-interface.html" title="How to define and implement interfaces">
24
24
<link rel="chapter" href="howto-signals.html" title="How to create and use signals">
25
 
<link rel="part" href="pt03.html" title="Part&#160;V.&#160;Related Tools">
 
25
<link rel="part" href="pt03.html" title="Part V. Related Tools">
 
26
<link rel="chapter" href="tools-vala.html" title="Vala">
26
27
<link rel="chapter" href="tools-gob.html" title="GObject builder">
27
28
<link rel="chapter" href="tools-ginspector.html" title="Graphical inspection of GObjects">
28
29
<link rel="chapter" href="tools-refdb.html" title="Debugging reference count problems">
36
37
<link rel="index" href="ix07.html" title="Index of new symbols in 2.10">
37
38
<link rel="index" href="ix08.html" title="Index of new symbols in 2.12">
38
39
<link rel="index" href="ix09.html" title="Index of new symbols in 2.14">
 
40
<link rel="index" href="ix10.html" title="Index of new symbols in 2.14">
39
41
</head>
40
42
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
41
43
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
52
54
      One of GObject's nice features is its generic get/set mechanism for object
53
55
      properties. When an object
54
56
      is instantiated, the object's class_init handler should be used to register
55
 
      the object's properties with <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-class-install-property">g_object_class_install_property</a></code>
 
57
      the object's properties with <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-class-install-property" title="g_object_class_install_property ()">g_object_class_install_property</a></code>
56
58
      (implemented in <code class="filename">gobject.c</code>).
57
59
    </p>
58
60
<p>
64
66
/* Implementation                               */
65
67
/************************************************/
66
68
 
67
 
enum {
68
 
  MAMAN_BAR_CONSTRUCT_NAME = 1,
69
 
  MAMAN_BAR_PAPA_NUMBER,
 
69
enum
 
70
{
 
71
  PROP_0,
 
72
 
 
73
  PROP_MAMAN_NAME,
 
74
  PROP_PAPA_NUMBER
70
75
};
71
76
 
72
77
static void
73
 
maman_bar_instance_init (GTypeInstance   *instance,
74
 
                         gpointer         g_class)
75
 
{
76
 
  MamanBar *self = (MamanBar *)instance;
77
 
}
78
 
 
79
 
static void
80
78
maman_bar_set_property (GObject      *object,
81
79
                        guint         property_id,
82
80
                        const GValue *value,
83
81
                        GParamSpec   *pspec)
84
82
{
85
 
  MamanBar *self = (MamanBar *) object;
86
 
 
87
 
  switch (property_id) {
88
 
  case MAMAN_BAR_CONSTRUCT_NAME: {
89
 
    g_free (self-&gt;priv-&gt;name);
90
 
    self-&gt;priv-&gt;name = g_value_dup_string (value);
91
 
    g_print ("maman: %s\n",self-&gt;priv-&gt;name);
92
 
  }
93
 
    break;
94
 
  case MAMAN_BAR_PAPA_NUMBER: {
95
 
    self-&gt;priv-&gt;papa_number = g_value_get_uchar (value);
96
 
    g_print ("papa: %u\n",self-&gt;priv-&gt;papa_number);
97
 
  }
98
 
    break;
99
 
  default:
100
 
    /* We don't have any other property... */
101
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
102
 
    break;
103
 
  }
 
83
  MamanBar *self = MAMAN_BAR (object);
 
84
 
 
85
  switch (property_id)
 
86
    {
 
87
    case PROP_MAMAN_NAME:
 
88
      g_free (self-&gt;priv-&gt;name);
 
89
      self-&gt;priv-&gt;name = g_value_dup_string (value);
 
90
      g_print ("maman: %s\n", self-&gt;priv-&gt;name);
 
91
      break;
 
92
 
 
93
    case PROP_PAPA_NUMBER:
 
94
      self-&gt;priv-&gt;papa_number = g_value_get_uchar (value);
 
95
      g_print ("papa: %u\n", self-&gt;priv-&gt;papa_number);
 
96
      break;
 
97
 
 
98
    default:
 
99
      /* We don't have any other property... */
 
100
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 
101
      break;
 
102
    }
104
103
}
105
104
 
106
105
static void
107
 
maman_bar_get_property (GObject      *object,
108
 
                        guint         property_id,
109
 
                        GValue       *value,
110
 
                        GParamSpec   *pspec)
 
106
maman_bar_get_property (GObject    *object,
 
107
                        guint       property_id,
 
108
                        GValue     *value,
 
109
                        GParamSpec *pspec)
111
110
{
112
 
  MamanBar *self = (MamanBar *) object;
113
 
 
114
 
  switch (property_id) {
115
 
  case MAMAN_BAR_CONSTRUCT_NAME: {
116
 
    g_value_set_string (value, self-&gt;priv-&gt;name);
117
 
  }
118
 
    break;
119
 
  case MAMAN_BAR_PAPA_NUMBER: {
120
 
    g_value_set_uchar (value, self-&gt;priv-&gt;papa_number);
121
 
  }
122
 
    break;
123
 
  default:
124
 
    /* We don't have any other property... */
125
 
    G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
126
 
    break;
127
 
  }
 
111
  MamanBar *self = MAMAN_BAR (object);
 
112
 
 
113
  switch (property_id)
 
114
    {
 
115
    case PROP_MAMAN_NAME:
 
116
      g_value_set_string (value, self-&gt;priv-&gt;name);
 
117
      break;
 
118
 
 
119
    case PROP_PAPA_NUMBER:
 
120
      g_value_set_uchar (value, self-&gt;priv-&gt;papa_number);
 
121
      break;
 
122
 
 
123
    default:
 
124
      /* We don't have any other property... */
 
125
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 
126
      break;
 
127
    }
128
128
}
129
129
 
130
130
static void
131
 
maman_bar_class_init (gpointer g_class,
132
 
                      gpointer g_class_data)
 
131
maman_bar_class_init (MamanBarClass *klass)
133
132
{
134
133
  GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
135
 
  MamanBarClass *klass = MAMAN_BAR_CLASS (g_class);
136
134
  GParamSpec *pspec;
137
135
 
138
136
  gobject_class-&gt;set_property = maman_bar_set_property;
144
142
                               "no-name-set" /* default value */,
145
143
                               G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
146
144
  g_object_class_install_property (gobject_class,
147
 
                                   MAMAN_BAR_CONSTRUCT_NAME,
 
145
                                   PROP_MAMAN_NAME_NAME,
148
146
                                   pspec);
149
147
 
150
148
  pspec = g_param_spec_uchar ("papa-number",
155
153
                              2  /* default value */,
156
154
                              G_PARAM_READWRITE);
157
155
  g_object_class_install_property (gobject_class,
158
 
                                   MAMAN_BAR_PAPA_NUMBER,
 
156
                                   PROP_PAPA_NUMBER,
159
157
                                   pspec);
160
158
}
161
159
 
164
162
/************************************************/
165
163
 
166
164
GObject *bar;
167
 
GValue val = {0,};
 
165
GValue val = { 0, };
 
166
 
168
167
bar = g_object_new (MAMAN_TYPE_SUBBAR, NULL);
 
168
 
169
169
g_value_init (&amp;val, G_TYPE_CHAR);
170
170
g_value_set_char (&amp;val, 11);
 
171
 
171
172
g_object_set_property (G_OBJECT (bar), "papa-number", &amp;val);
 
173
 
 
174
g_value_unset (&amp;val);
172
175
</pre>
173
176
<p>
174
177
      The client code just above looks simple but a lot of things happen under the hood:
175
178
    </p>
176
179
<p>
177
 
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property">g_object_set_property</a></code> first ensures a property
 
180
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property" title="g_object_set_property ()">g_object_set_property</a></code> first ensures a property
178
181
      with this name was registered in bar's class_init handler. If so, it calls
179
182
      <code class="function">object_set_property</code> which first walks the class hierarchy,
180
183
      from bottom, most derived type, to top, fundamental type to find the class
184
187
<p>
185
188
      If the user provides a signed char GValue, as is shown
186
189
      here, and if the object's property was registered as an unsigned int, 
187
 
      <code class="function"><a class="link" href="gobject-Generic-values.html#g-value-transform">g_value_transform</a></code> will try to transform the input signed char into
 
190
      <code class="function"><a class="link" href="gobject-Generic-values.html#g-value-transform" title="g_value_transform ()">g_value_transform</a></code> will try to transform the input signed char into
188
191
      an unsigned int. Of course, the success of the transformation depends on the availability
189
192
      of the required transform function. In practice, there will almost always be a transformation
190
 
      <sup>[<a name="id2814560" href="#ftn.id2814560" class="footnote">6</a>]</sup>
 
193
      <sup>[<a name="id3013964" href="#ftn.id3013964" class="footnote">6</a>]</sup>
191
194
      which matches and conversion will be carried out if needed.
192
195
    </p>
193
196
<p>
194
 
      After transformation, the <span class="type"><a class="link" href="gobject-Generic-values.html#GValue">GValue</a></span> is validated by 
195
 
      <code class="function"><a class="link" href="gobject-GParamSpec.html#g-param-value-validate">g_param_value_validate</a></code> which makes sure the user's
196
 
      data stored in the <span class="type"><a class="link" href="gobject-Generic-values.html#GValue">GValue</a></span> matches the characteristics specified by
197
 
      the property's <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec">GParamSpec</a></span>.  Here, the <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec">GParamSpec</a></span> we 
 
197
      After transformation, the <span class="type"><a class="link" href="gobject-Generic-values.html#GValue" title="GValue">GValue</a></span> is validated by 
 
198
      <code class="function"><a class="link" href="gobject-GParamSpec.html#g-param-value-validate" title="g_param_value_validate ()">g_param_value_validate</a></code> which makes sure the user's
 
199
      data stored in the <span class="type"><a class="link" href="gobject-Generic-values.html#GValue" title="GValue">GValue</a></span> matches the characteristics specified by
 
200
      the property's <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec" title="GParamSpec">GParamSpec</a></span>.  Here, the <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec" title="GParamSpec">GParamSpec</a></span> we 
198
201
      provided in class_init has a validation function which makes sure that the GValue
199
202
      contains a value which respects the minimum and maximum bounds of the 
200
 
      <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec">GParamSpec</a></span>. In the example above, the client's GValue does not
 
203
      <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec" title="GParamSpec">GParamSpec</a></span>. In the example above, the client's GValue does not
201
204
      respect these constraints (it is set to 11, while the maximum is 10). As such, the
202
 
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property">g_object_set_property</a></code> function will return with an error.
 
205
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property" title="g_object_set_property ()">g_object_set_property</a></code> function will return with an error.
203
206
    </p>
204
207
<p>
205
 
      If the user's GValue had been set to a valid value, <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property">g_object_set_property</a></code>
 
208
      If the user's GValue had been set to a valid value, <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property" title="g_object_set_property ()">g_object_set_property</a></code>
206
209
      would have proceeded with calling the object's set_property class method. Here, since our
207
210
      implementation of Foo did override this method, the code path would jump to
208
211
      <code class="function">foo_set_property</code> after having retrieved from the 
209
 
      <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec">GParamSpec</a></span> the <span class="emphasis"><em>param_id</em></span>
210
 
      <sup>[<a name="id2814662" href="#ftn.id2814662" class="footnote">7</a>]</sup>
 
212
      <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec" title="GParamSpec">GParamSpec</a></span> the <span class="emphasis"><em>param_id</em></span>
 
213
      <sup>[<a name="id3014079" href="#ftn.id3014079" class="footnote">7</a>]</sup>
211
214
      which had been stored by
212
 
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-class-install-property">g_object_class_install_property</a></code>.
 
215
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-class-install-property" title="g_object_class_install_property ()">g_object_class_install_property</a></code>.
213
216
    </p>
214
217
<p>
215
218
      Once the property has been set by the object's set_property class method, the code path
216
 
      returns to <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property">g_object_set_property</a></code> which calls 
 
219
      returns to <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property" title="g_object_set_property ()">g_object_set_property</a></code> which calls 
217
220
      <code class="function">g_object_notify_queue_thaw</code>. This function makes sure that
218
221
      the "notify" signal is emitted on the object's instance with the changed property as
219
 
      parameter unless notifications were frozen by <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-freeze-notify">g_object_freeze_notify</a></code>.
 
222
      parameter unless notifications were frozen by <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-freeze-notify" title="g_object_freeze_notify ()">g_object_freeze_notify</a></code>.
220
223
    </p>
221
224
<p>
222
 
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-thaw-notify">g_object_thaw_notify</a></code> can be used to re-enable notification of 
 
225
      <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-thaw-notify" title="g_object_thaw_notify ()">g_object_thaw_notify</a></code> can be used to re-enable notification of 
223
226
      property modifications through the "notify" signal. It is important to remember that
224
227
      even if properties are changed while property change notification is frozen, the "notify"
225
228
      signal will be emitted once for each of these changed properties as soon as the property
228
231
    </p>
229
232
<p>
230
233
      It sounds like a tedious task to set up GValues every time when one wants to modify a property.
231
 
      In practice one will rarely do this. The functions <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property">g_object_set_property</a></code>
232
 
      and <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-get-property">g_object_get_property</a></code>
 
234
      In practice one will rarely do this. The functions <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property" title="g_object_set_property ()">g_object_set_property</a></code>
 
235
      and <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-get-property" title="g_object_get_property ()">g_object_get_property</a></code>
233
236
      are meant to be used by language bindings. For application there is an easier way and
234
237
      that is described next.
235
238
    </p>
237
240
<div class="titlepage"><div><div><h3 class="title">
238
241
<a name="gobject-multi-properties"></a>Accessing multiple properties at once</h3></div></div></div>
239
242
<p>
240
 
        It is interesting to note that the <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></code> and 
241
 
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-valist">g_object_set_valist</a></code> (vararg version) functions can be used to set
 
243
        It is interesting to note that the <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set" title="g_object_set ()">g_object_set</a></code> and 
 
244
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-valist" title="g_object_set_valist ()">g_object_set_valist</a></code> (vararg version) functions can be used to set
242
245
        multiple properties at once. The client code shown above can then be re-written as:
243
246
</p>
244
247
<pre class="programlisting">
251
254
</pre>
252
255
<p>
253
256
        This saves us from managing the GValues that we were needing to handle when using
254
 
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property">g_object_set_property</a></code>.
 
257
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set-property" title="g_object_set_property ()">g_object_set_property</a></code>.
255
258
        The code above will trigger one notify signal emission for each property modified.
256
259
      </p>
257
260
<p>
258
 
        Of course, the _get versions are also available: <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-get">g_object_get</a></code>
259
 
        and <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-get-valist">g_object_get_valist</a></code> (vararg version) can be used to get numerous
 
261
        Of course, the _get versions are also available: <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-get" title="g_object_get ()">g_object_get</a></code>
 
262
        and <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-get-valist" title="g_object_get_valist ()">g_object_get_valist</a></code> (vararg version) can be used to get numerous
260
263
        properties at once.
261
264
      </p>
262
265
<p>
267
270
        NULL will lead to unexpected behaviour.
268
271
      </p>
269
272
<p>
270
 
        Really attentive readers now understand how <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new">g_object_new</a></code>,
271
 
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-newv">g_object_newv</a></code> and <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new-valist">g_object_new_valist</a></code> 
 
273
        Really attentive readers now understand how <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code>,
 
274
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-newv" title="g_object_newv ()">g_object_newv</a></code> and <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new-valist" title="g_object_new_valist ()">g_object_new_valist</a></code> 
272
275
        work: they parse the user-provided variable number of parameters and invoke
273
 
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></code> on the parameters only after the object has been successfully constructed.
 
276
        <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-set" title="g_object_set ()">g_object_set</a></code> on the parameters only after the object has been successfully constructed.
274
277
        Of course, the "notify" signal will be emitted for each property set.
275
278
      </p>
276
279
</div>
277
280
<div class="footnotes">
278
281
<br><hr width="100" align="left">
279
 
<div class="footnote"><p><sup>[<a name="ftn.id2814560" href="#id2814560" class="para">6</a>] </sup>Its behaviour might not be what you expect but it is up to you to actually avoid
 
282
<div class="footnote"><p><sup>[<a name="ftn.id3013964" href="#id3013964" class="para">6</a>] </sup>Its behaviour might not be what you expect but it is up to you to actually avoid
280
283
          relying on these transformations.
281
284
        </p></div>
282
 
<div class="footnote"><p><sup>[<a name="ftn.id2814662" href="#id2814662" class="para">7</a>] </sup>
 
285
<div class="footnote"><p><sup>[<a name="ftn.id3014079" href="#id3014079" class="para">7</a>] </sup>
283
286
          It should be noted that the param_id used here need only to uniquely identify each 
284
 
          <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec">GParamSpec</a></span> within the <span class="type">FooClass</span> such that the switch
 
287
          <span class="type"><a class="link" href="gobject-GParamSpec.html#GParamSpec" title="GParamSpec">GParamSpec</a></span> within the <span class="type">FooClass</span> such that the switch
285
288
          used in the set and get methods actually works. Of course, this locally-unique 
286
289
          integer is purely an optimization: it would have been possible to use a set of 
287
290
          <span class="emphasis"><em>if (strcmp (a, b) == 0) {} else if (strcmp (a, b) == 0) {}</em></span> statements.
288
291
        </p></div>
289
292
</div>
290
293
</div>
 
294
<div class="footer">
 
295
<hr>
 
296
          Generated by GTK-Doc V1.11</div>
291
297
</body>
292
298
</html>