| OLD | NEW |
| 1 # | 1 # |
| 2 # Copyright (C) 2013 Google Inc. All rights reserved. | 2 # Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 # | 3 # |
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
| 5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
| 6 # met: | 6 # met: |
| 7 # | 7 # |
| 8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
| 9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
| 10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 # | 29 # |
| 30 | 30 |
| 31 # Generate IDL bindings, together with auxiliary files |
| 32 # (constructors on global objects, aggregate bindings files). |
| 33 # |
| 34 # Design doc: |
| 35 # https://sites.google.com/a/chromium.org/dev/developers/design-documents/idl-bu
ild |
| 36 |
| 31 { | 37 { |
| 32 'includes': [ | 38 'includes': [ |
| 33 '../build/scripts/scripts.gypi', | 39 '../build/scripts/scripts.gypi', |
| 34 '../build/win/precompile.gypi', | 40 '../build/win/precompile.gypi', |
| 35 '../build/scripts/scripts.gypi', | 41 '../build/scripts/scripts.gypi', |
| 36 '../core/core.gypi', | 42 '../core/core.gypi', |
| 37 '../modules/modules.gypi', | 43 '../modules/modules.gypi', |
| 38 'bindings.gypi', | 44 'bindings.gypi', |
| 39 ], | 45 ], |
| 40 | 46 |
| 41 'variables': { | 47 'variables': { |
| 42 # For details, see: http://www.chromium.org/developers/web-idl-interfaces | 48 # For details, see: http://www.chromium.org/developers/web-idl-interfaces |
| 43 # | 49 # |
| 44 # Interface IDL files / Dependency IDL files | 50 # Interface IDL files / Dependency IDL files |
| 45 # Interface IDL files: generate individual bindings (includes testing) | 51 # Interface IDL files: generate individual bindings (includes testing) |
| 46 'interface_idl_files': [ | 52 'interface_idl_files': [ |
| 47 '<@(static_interface_idl_files)', | 53 '<@(static_interface_idl_files)', |
| 48 '<@(generated_interface_idl_files)', | 54 '<@(generated_interface_idl_files)', |
| 49 ], | 55 ], |
| 50 # Dependency IDL files: don't generate individual bindings, but do process | 56 # Dependency IDL files: don't generate individual bindings, but do process |
| 51 # in IDL dependency computation, and count as build dependencies | 57 # in IDL dependency computation, and count as build dependencies |
| 52 'dependency_idl_files': [ | 58 'dependency_idl_files': [ |
| 53 '<@(static_dependency_idl_files)', | 59 '<@(static_dependency_idl_files)', |
| 54 '<@(generated_dependency_idl_files)', | 60 '<@(generated_dependency_idl_files)', |
| 55 ], | 61 ], |
| 56 # Include in aggregate bindings (exclude testing) | 62 # Main interface IDL files (excluding dependencies and testing) |
| 57 # The only differences for testing files are: | 63 # are included as properties on global objects, and in aggregate bindings |
| 58 # * They are not included in aggregate bindings (excluded from below list) | |
| 59 # * They do not appear as a property on the global object (Window): | |
| 60 # specify [NoInterfaceObject] on the interface in the .idl file | |
| 61 'main_interface_idl_files': [ | 64 'main_interface_idl_files': [ |
| 62 '<@(core_idl_files)', | 65 '<@(core_idl_files)', |
| 63 '<@(modules_idl_files)', | 66 '<@(modules_idl_files)', |
| 64 ], | 67 ], |
| 65 | 68 |
| 66 # Static IDL files / Generated IDL files | 69 # Static IDL files / Generated IDL files |
| 67 # Paths need to be passed separately for static and generated files, as | 70 # Paths need to be passed separately for static and generated files, as |
| 68 # static files are listed in a temporary file (b/c too long for command | 71 # static files are listed in a temporary file (b/c too long for command |
| 69 # line), but generated files must be passed at the command line, as they are | 72 # line), but generated files must be passed at the command line, as they are |
| 70 # not present at GYP time, when the temporary file is generated | 73 # not present at GYP time, when the temporary file is generated |
| 71 'static_idl_files': [ | 74 'static_idl_files': [ |
| 72 '<@(static_interface_idl_files)', | 75 '<@(static_interface_idl_files)', |
| 73 '<@(static_dependency_idl_files)', | 76 '<@(static_dependency_idl_files)', |
| 74 ], | 77 ], |
| 75 'generated_idl_files': [ | 78 'generated_idl_files': [ |
| 76 '<@(generated_interface_idl_files)', | 79 '<@(generated_interface_idl_files)', |
| 77 # FIXME: generate global constructors *before* computing dependencies | 80 '<@(generated_dependency_idl_files)', |
| 78 # '<@(generated_dependency_idl_files)', | |
| 79 ], | 81 ], |
| 80 | 82 |
| 81 # Static IDL files | 83 # Static IDL files |
| 82 'static_interface_idl_files': [ | 84 'static_interface_idl_files': [ |
| 83 '<@(core_idl_files)', | 85 '<@(core_idl_files)', |
| 84 '<@(webcore_testing_idl_files)', | 86 '<@(webcore_testing_idl_files)', |
| 85 '<@(modules_idl_files)', | 87 '<@(modules_idl_files)', |
| 86 ], | 88 ], |
| 87 'static_dependency_idl_files': [ | 89 'static_dependency_idl_files': [ |
| 88 '<@(core_dependency_idl_files)', | 90 '<@(core_dependency_idl_files)', |
| 89 '<@(modules_dependency_idl_files)', | 91 '<@(modules_dependency_idl_files)', |
| 90 '<@(modules_testing_dependency_idl_files)', | 92 '<@(modules_testing_dependency_idl_files)', |
| 91 ], | 93 ], |
| 92 | 94 |
| 93 # Generated IDL files | 95 # Generated IDL files |
| 94 'generated_interface_idl_files': [ | 96 'generated_interface_idl_files': [ |
| 95 '<@(generated_webcore_testing_idl_files)', # interfaces | 97 '<@(generated_webcore_testing_idl_files)', # interfaces |
| 96 ], | 98 ], |
| 97 'generated_dependency_idl_files': [ | 99 'generated_dependency_idl_files': [ |
| 98 '<@(generated_global_constructors_idl_files)', # partial interfaces | 100 '<@(generated_global_constructors_idl_files)', # partial interfaces |
| 99 ], | 101 ], |
| 100 | 102 |
| 101 'generated_global_constructors_idl_files': [ | 103 'generated_global_constructors_idl_files': [ |
| 102 '<(SHARED_INTERMEDIATE_DIR)/blink/WindowConstructors.idl', | 104 '<(SHARED_INTERMEDIATE_DIR)/blink/WindowConstructors.idl', |
| 103 '<(SHARED_INTERMEDIATE_DIR)/blink/WorkerGlobalScopeConstructors.idl', | 105 '<(SHARED_INTERMEDIATE_DIR)/blink/WorkerGlobalScopeConstructors.idl', |
| 104 '<(SHARED_INTERMEDIATE_DIR)/blink/SharedWorkerGlobalScopeConstructors.idl
', | 106 '<(SHARED_INTERMEDIATE_DIR)/blink/SharedWorkerGlobalScopeConstructors.idl'
, |
| 105 '<(SHARED_INTERMEDIATE_DIR)/blink/DedicatedWorkerGlobalScopeConstructors.
idl', | 107 '<(SHARED_INTERMEDIATE_DIR)/blink/DedicatedWorkerGlobalScopeConstructors.i
dl', |
| 106 '<(SHARED_INTERMEDIATE_DIR)/ServiceWorkerGlobalScopeConstructors.idl', | 108 '<(SHARED_INTERMEDIATE_DIR)/ServiceWorkerGlobalScopeConstructors.idl', |
| 107 ], | 109 ], |
| 108 | 110 |
| 109 'compiler_module_files': [ | 111 'compiler_module_files': [ |
| 110 'scripts/unstable/idl_compiler.py', | 112 'scripts/unstable/idl_compiler.py', |
| 111 '<(DEPTH)/third_party/ply/lex.py', | 113 '<(DEPTH)/third_party/ply/lex.py', |
| 112 '<(DEPTH)/third_party/ply/yacc.py', | 114 '<(DEPTH)/third_party/ply/yacc.py', |
| 113 # jinja2/__init__.py contains version string, so sufficient for package | 115 # jinja2/__init__.py contains version string, so sufficient for package |
| 114 '<(DEPTH)/third_party/jinja2/__init__.py', | 116 '<(DEPTH)/third_party/jinja2/__init__.py', |
| 115 '<(DEPTH)/third_party/markupsafe/__init__.py', # jinja2 dep | 117 '<(DEPTH)/third_party/markupsafe/__init__.py', # jinja2 dep |
| 116 '<(DEPTH)/tools/idl_parser/idl_lexer.py', | 118 '<(DEPTH)/tools/idl_parser/idl_lexer.py', |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 # depending on what the user has locally it could be. So, don't use on | 165 # depending on what the user has locally it could be. So, don't use on |
| 164 # Windows is the simplest solution. | 166 # Windows is the simplest solution. |
| 165 'json_perl_module_include_path': '-I<(DEPTH)/third_party/JSON/out/lib/pe
rl5', | 167 'json_perl_module_include_path': '-I<(DEPTH)/third_party/JSON/out/lib/pe
rl5', |
| 166 }, { | 168 }, { |
| 167 'json_perl_module_include_path': '', | 169 'json_perl_module_include_path': '', |
| 168 }], | 170 }], |
| 169 ], | 171 ], |
| 170 }, | 172 }, |
| 171 | 173 |
| 172 'targets': [{ | 174 'targets': [{ |
| 173 'target_name': 'interface_dependencies', | 175 'target_name': 'global_constructors_idls', |
| 176 'type': 'none', |
| 177 'actions': [{ |
| 178 'action_name': 'generate_global_constructors_idls', |
| 179 'variables': { |
| 180 # Write list of IDL files to a file, so that the command line doesn't |
| 181 # exceed OS length limits. |
| 182 # Only includes main IDL files (exclude dependencies and testing, |
| 183 # which should not appear on global objects). |
| 184 'main_interface_idl_files_list': '<|(main_interface_idl_files_list.tmp <
@(main_interface_idl_files))', |
| 185 }, |
| 186 'inputs': [ |
| 187 'scripts/generate_global_constructors.py', |
| 188 'scripts/utilities.py', |
| 189 '<(main_interface_idl_files_list)', |
| 190 '<@(main_interface_idl_files)', |
| 191 ], |
| 192 'outputs': [ |
| 193 '<@(generated_global_constructors_idl_files)', |
| 194 ], |
| 195 'action': [ |
| 196 'python', |
| 197 'scripts/generate_global_constructors.py', |
| 198 '--idl-files-list', |
| 199 '<(main_interface_idl_files_list)', |
| 200 '<@(write_file_only_if_changed)', |
| 201 '--', |
| 202 'Window', |
| 203 '<(SHARED_INTERMEDIATE_DIR)/blink/WindowConstructors.idl', |
| 204 'WorkerGlobalScope', |
| 205 '<(SHARED_INTERMEDIATE_DIR)/blink/WorkerGlobalScopeConstructors.idl', |
| 206 'SharedWorkerGlobalScope', |
| 207 '<(SHARED_INTERMEDIATE_DIR)/blink/SharedWorkerGlobalScopeConstructors.id
l', |
| 208 'DedicatedWorkerGlobalScope', |
| 209 '<(SHARED_INTERMEDIATE_DIR)/blink/DedicatedWorkerGlobalScopeConstructors
.idl', |
| 210 'ServiceWorkerGlobalScope', |
| 211 '<(SHARED_INTERMEDIATE_DIR)/ServiceWorkerGlobalScopeConstructors.idl', |
| 212 ], |
| 213 'message': 'Generating IDL files for interface properties on global objec
ts', |
| 214 }] |
| 215 }, |
| 216 { |
| 217 'target_name': 'interfaces_info', |
| 174 'type': 'none', | 218 'type': 'none', |
| 175 'dependencies': [ | 219 'dependencies': [ |
| 220 'global_constructors_idls', |
| 176 '../core/core_generated.gyp:generated_testing_idls', | 221 '../core/core_generated.gyp:generated_testing_idls', |
| 177 ], | 222 ], |
| 178 'actions': [{ | 223 'actions': [{ |
| 179 'action_name': 'compute_interface_dependencies', | 224 'action_name': 'compute_interfaces_info', |
| 180 'variables': { | 225 'variables': { |
| 181 # Write list of static IDL files to a file, so that the command line | 226 # Write list of static IDL files to a file, so that the command line |
| 182 # doesn't exceed OS length limits. | 227 # doesn't exceed OS length limits. |
| 183 # Generated IDL files cannot be included, as their path depends on the | 228 # Generated IDL files cannot be included, as their path depends on the |
| 184 # build directory, and must instead be passed as command line arguments. | 229 # build directory, and must instead be passed as command line arguments. |
| 185 'idl_files_list': '<|(idl_files_list.tmp <@(static_idl_files))', | 230 'idl_files_list': '<|(idl_files_list.tmp <@(static_idl_files))', |
| 186 }, | 231 }, |
| 187 'inputs': [ | 232 'inputs': [ |
| 188 'scripts/compute_dependencies.py', | 233 'scripts/compute_interfaces_info.py', |
| 234 'scripts/utilities.py', |
| 189 '<(idl_files_list)', | 235 '<(idl_files_list)', |
| 190 '<@(static_idl_files)', | 236 '<@(static_idl_files)', |
| 191 '<@(generated_idl_files)', | 237 '<@(generated_idl_files)', |
| 192 ], | 238 ], |
| 193 'outputs': [ | 239 'outputs': [ |
| 194 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfaceDependencies.txt', | 240 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfaceDependencies.txt', |
| 195 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfacesInfo.pickle', | 241 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfacesInfo.pickle', |
| 196 '<@(generated_global_constructors_idl_files)', | 242 '<(SHARED_INTERMEDIATE_DIR)/blink/EventInterfaces.in', |
| 197 '<(SHARED_INTERMEDIATE_DIR)/blink/EventInterfaces.in', | 243 ], |
| 198 ], | 244 'action': [ |
| 199 'action': [ | 245 'python', |
| 200 'python', | 246 'scripts/compute_interfaces_info.py', |
| 201 'scripts/compute_dependencies.py', | 247 '--idl-files-list', |
| 202 '--idl-files-list', | 248 '<(idl_files_list)', |
| 203 '<(idl_files_list)', | 249 '--interface-dependencies-file', |
| 204 '--interface-dependencies-file', | 250 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfaceDependencies.txt', |
| 205 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfaceDependencies.txt', | 251 '--interfaces-info-file', |
| 206 '--interfaces-info-file', | 252 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfacesInfo.pickle', |
| 207 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfacesInfo.pickle', | 253 '--event-names-file', |
| 208 '--window-constructors-file', | 254 '<(SHARED_INTERMEDIATE_DIR)/blink/EventInterfaces.in', |
| 209 '<(SHARED_INTERMEDIATE_DIR)/blink/WindowConstructors.idl', | 255 '<@(write_file_only_if_changed)', |
| 210 '--workerglobalscope-constructors-file', | 256 '--', |
| 211 '<(SHARED_INTERMEDIATE_DIR)/blink/WorkerGlobalScopeConstructors.idl', | 257 '<@(generated_idl_files)', |
| 212 '--sharedworkerglobalscope-constructors-file', | 258 ], |
| 213 '<(SHARED_INTERMEDIATE_DIR)/blink/SharedWorkerGlobalScopeConstructors.i
dl', | 259 'message': 'Computing global information about IDL files, and generating l
ist of Event interfaces', |
| 214 '--dedicatedworkerglobalscope-constructors-file', | |
| 215 '<(SHARED_INTERMEDIATE_DIR)/blink/DedicatedWorkerGlobalScopeConstructor
s.idl', | |
| 216 '--serviceworkerglobalscope-constructors-file', | |
| 217 '<(SHARED_INTERMEDIATE_DIR)/ServiceWorkerGlobalScopeConstructors.idl', | |
| 218 '--event-names-file', | |
| 219 '<(SHARED_INTERMEDIATE_DIR)/blink/EventInterfaces.in', | |
| 220 '<@(write_file_only_if_changed)', | |
| 221 '--', | |
| 222 '<@(generated_idl_files)', | |
| 223 ], | |
| 224 'message': 'Computing dependencies between IDL files, and generating glob
al scope constructor IDLs files and list of Event interfaces', | |
| 225 }] | 260 }] |
| 226 }, | 261 }, |
| 227 { | 262 { |
| 228 'target_name': 'individual_generated_bindings', | 263 'target_name': 'individual_generated_bindings', |
| 229 'type': 'none', | 264 'type': 'none', |
| 230 # The 'binding' rule generates .h files, so mark as hard_dependency, per: | 265 # The 'binding' rule generates .h files, so mark as hard_dependency, per: |
| 231 # https://code.google.com/p/gyp/wiki/InputFormatReference#Linking_Dependen
cies | 266 # https://code.google.com/p/gyp/wiki/InputFormatReference#Linking_Dependen
cies |
| 232 'hard_dependency': 1, | 267 'hard_dependency': 1, |
| 233 'dependencies': [ | 268 'dependencies': [ |
| 234 'interface_dependencies', | 269 'interfaces_info', |
| 235 '../core/core_generated.gyp:generated_testing_idls', | 270 '../core/core_generated.gyp:generated_testing_idls', |
| 236 ], | 271 ], |
| 237 'sources': [ | 272 'sources': [ |
| 238 '<@(interface_idl_files)', | 273 '<@(interface_idl_files)', |
| 239 ], | 274 ], |
| 240 'rules': [{ | 275 'rules': [{ |
| 241 'rule_name': 'binding', | 276 'rule_name': 'binding', |
| 242 'extension': 'idl', | 277 'extension': 'idl', |
| 243 'msvs_external_rule': 1, | 278 'msvs_external_rule': 1, |
| 244 'inputs': [ | 279 'inputs': [ |
| 245 'scripts/generate_bindings.pl', | 280 'scripts/generate_bindings.pl', |
| 246 'scripts/code_generator_v8.pm', | 281 'scripts/code_generator_v8.pm', |
| 247 'scripts/idl_parser.pm', | 282 'scripts/idl_parser.pm', |
| 248 'scripts/idl_serializer.pm', | 283 'scripts/idl_serializer.pm', |
| 249 '../build/scripts/preprocessor.pm', | 284 '../build/scripts/preprocessor.pm', |
| 250 'IDLExtendedAttributes.txt', | 285 'IDLExtendedAttributes.txt', |
| 251 # If the dependency structure or public interface info (e.g., | 286 # If the dependency structure or public interface info (e.g., |
| 252 # [ImplementedAs]) changes, we rebuild all files, since we're not | 287 # [ImplementedAs]) changes, we rebuild all files, since we're not |
| 253 # computing dependencies file-by-file in the build. | 288 # computing dependencies file-by-file in the build. |
| 254 # This data is generally stable. | 289 # This data is generally stable. |
| 255 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfaceDependencies.txt', | 290 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfaceDependencies.txt', |
| 256 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfacesInfo.pickle', | 291 '<(SHARED_INTERMEDIATE_DIR)/blink/InterfacesInfo.pickle', |
| 257 # Further, if any dependency (partial interface or implemented | 292 # Further, if any dependency (partial interface or implemented |
| 258 # interface) changes, rebuild everything, since every IDL potentially | 293 # interface) changes, rebuild everything, since every IDL potentially |
| 259 # depends on them, because we're not computing dependencies | 294 # depends on them, because we're not computing dependencies |
| 260 # file-by-file. | 295 # file-by-file. |
| 261 # FIXME: This is too conservative, and causes excess rebuilds: | 296 # FIXME: This is too conservative, and causes excess rebuilds: |
| 262 # compute this file-by-file. | 297 # compute this file-by-file. http://crbug.com/341748 |
| 263 '<@(dependency_idl_files)', | 298 '<@(dependency_idl_files)', |
| 264 ], | 299 ], |
| 265 'outputs': [ | 300 'outputs': [ |
| 266 '<(bindings_output_dir)/V8<(RULE_INPUT_ROOT).cpp', | 301 '<(bindings_output_dir)/V8<(RULE_INPUT_ROOT).cpp', |
| 267 '<(bindings_output_dir)/V8<(RULE_INPUT_ROOT).h', | 302 '<(bindings_output_dir)/V8<(RULE_INPUT_ROOT).h', |
| 268 ], | 303 ], |
| 269 'variables': { | 304 'variables': { |
| 270 # IDL include paths. The generator will search recursively for IDL | 305 # IDL include paths. The generator will search recursively for IDL |
| 271 # files under these locations. | 306 # files under these locations. |
| 272 'generator_include_dirs': [ | 307 'generator_include_dirs': [ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 { | 367 { |
| 333 'target_name': 'generated_bindings', | 368 'target_name': 'generated_bindings', |
| 334 'type': 'none', | 369 'type': 'none', |
| 335 'dependencies': [ | 370 'dependencies': [ |
| 336 'aggregate_generated_bindings', | 371 'aggregate_generated_bindings', |
| 337 'individual_generated_bindings', | 372 'individual_generated_bindings', |
| 338 ], | 373 ], |
| 339 }, | 374 }, |
| 340 ], | 375 ], |
| 341 } | 376 } |
| OLD | NEW |